Donc, je pense que j'ai vu une solution à cela, mais ils sont toutes des requêtes très compliquées. Je suis à Oracle 11g pour référence.
Ce que j'ai est simple à beaucoup de rejoindre ce qui fonctionne bien, mais je n'ai pas besoin des nombreux. Je veux juste que la table de gauche (celle) rejoint simplement une ligne qui réponde aux critères de jointure ... pas beaucoup de lignes. P>
Je dois faire cela parce que la requête est dans un rouleau qui compte donc si je fais la jointure de gauche normale, je reçois 5 rangées où je ne devrais obtenir que 1. P>
Sure Exemple Les données sont les suivantes: p> Ce que je dois faire est de rejoindre ces deux tables sur assignation = assignment_group mais seulement 1 ligne renvoyée. P> Lorsque je fais une jointe à gauche, je reçois trois rangées retournées Beauxe qui est la nature de HTE Gauche Joindre P> P>
6 Réponses :
Je pense que ce dont vous avez besoin est d'utiliser groupe par code> sur le champ
assignment_group code>. p>
Je ne pense pas que cela obtiendra ce que je veux parce que j'ai besoin d'autres informations dans les autres champs. Je devrais faire des choses étranges comme les concaténer.
Vous pouvez utiliser SubQuery - Sélectionnez le top 1 p>
Utilisez la limite 1 alors. Pas de gros problème.
Oracle ne prend également pas en charge la clause code> limite code>.
Si Oracle prend en charge le numéro de ligne (partition par), vous pouvez créer une sous-requête Sélection dans laquelle la ligne est égale 1.
SELECT * FROM table1 LEFT JOIN (SELECT * FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY assignmentgroup ORDER BY assignmentgroup) AS Seq FROM table2) a WHERE Seq = 1) v ON assignmet = v.assignmentgroup
Pourriez-vous poster un exemple d'instruction SQL basée sur la requête ci-dessus. Je sais que vous pouvez faire une sous-requête, tout simplement pas sûr de la syntaxe.
in Oracle, si vous voulez 1 résultat, vous pouvez utiliser le Le problème avec cette requête unique est que Oracle ne renvoie jamais les données dans le même ordre. Donc, vous devez exercer vos données avant d'utiliser ROWNUM: P> rownum code>
instruction pour obtenir les premières valeurs d'une requête, par exemple: SELECT *
FROM
TABLE1 T1
LEFT JOIN
(SELECT *
FROM TABLE2 T2 WHERE T1.ASSIGNMENT = T2.ASSIGNMENT_GROUP
AND
ROWNUM = 1) T3 ON T1.ASSIGNMENT = T3.ASSIGNMENT_GROUP
Cela ne me limitera pas à 1 rangée de la table 1 aussi? J'ai besoin d'une rangée de la table de jointure 2 chacune mais toutes les lignes du tableau 1.
Vous ne pouvez pas référencer t1.Assignment code> comme celui-ci dans votre affichage en ligne depuis que
t1 code> est défini à un niveau supérieur de la requête. Vous pouvez ajouter une fonction analytique que les partitions par
t2.Assignment_group code> puis incluent le grade dans les critères de jointure (un exemple de celui-ci est ci-dessous). Ou vous pouvez déplacer la requête contre
T2 code> dans une sous-requête scalaire dans votre liste
SELECT CODE> La liste peut être beaucoup moins efficace.
Dans MySQL, vous pourriez simplement grouper par attribution et être fait. Oracle est plus strict et refuse de simplement choisir (de manière indéfinie) qui valorisent les trois rangées à choisir. Cela signifie que toutes les colonnes retournées doivent faire partie du groupe par ou être soumise à une fonction d'Aggregat (comptage, min, max ...)
Vous pouvez bien sûr choisir de ne pas vous soucier et d'utiliser une fonction d'Aggregat sur le colonnes retournées. p> Si vous faites cela, je doute sérieusement que vous avez besoin de la jointure en premier lieu. P> MySQL pourrait également aider avec group_concat dans Le cas que vous souhaitez une concaténation de chaîne de valeurs de groupe pour une colonne (les humains comme ça), mais avec Oracle qui est STANDGY SPLIX . P> Utiliser une sous-requête Comme déjà suggéré est une option, Regardez ici pour un exemple. Il vous permet également de trier la sous-requête avant de sélectionner la rangée supérieure. P> p>
Cette question concerne Oracle, de sorte que tout ce que vous pouvez faire dans une DB différente n'a pas d'importance
Tu pourrais faire quelque chose comme ça.
SELECT t1.ticket_id, t1.assignment, t2.manager_name, t2.user FROM table1 t1 LEFT OUTER JOIN (SELECT manager_name, assignment_group, user, row_number() over (partition by assignment_group --order by <<something>> ) rnk FROM table2) t2 ON ( t1.assignment = t2.assignment_group AND t2.rnk = 1 )
Pourriez-vous s'il vous plaît ajouter (peut-être commenté sa propre ligne) la commande par clause
@RuneJeppesen - Ajout d'un exemple de la commande par code>.
Bien qu'il y ait de nombreuses réponses publiées, il est impossible de savoir ce dont vous avez besoin si vous n'expliquez pas pourquoi vous ne voulez que 1 rangée. Voulez-vous vraiment un utilisateur aléatoire par mission_group? Pourquoi?