11
votes

Comment puis-je limiter le nombre de lignes retournées par cette jointure à gauche à un?

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.

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.

Sure Exemple Les données sont les suivantes: xxx

Ce que je dois faire est de rejoindre ces deux tables sur assignation = assignment_group mais seulement 1 ligne renvoyée.

Lorsque je fais une jointe à gauche, je reçois trois rangées retournées Beauxe qui est la nature de HTE Gauche Joindre


1 commentaires

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?


6 Réponses :


2
votes

Je pense que ce dont vous avez besoin est d'utiliser groupe par sur le champ assignment_group .

http://www.w3schools.com/sql/sql_groupby.asp < / p>


1 commentaires

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.



-2
votes

Vous pouvez utiliser SubQuery - Sélectionnez le top 1


2 commentaires

Utilisez la limite 1 alors. Pas de gros problème.


Oracle ne prend également pas en charge la clause limite .



11
votes

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


1 commentaires

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.



1
votes

in Oracle, si vous voulez 1 résultat, vous pouvez utiliser le rownum code> instruction pour obtenir les premières valeurs d'une requête, par exemple: xxx pré>

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>

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


2 commentaires

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 comme celui-ci dans votre affichage en ligne depuis que t1 est défini à un niveau supérieur de la requête. Vous pouvez ajouter une fonction analytique que les partitions par t2.Assignment_group 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 dans une sous-requête scalaire dans votre liste SELECT La liste peut être beaucoup moins efficace.



1
votes

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. xxx

Si vous faites cela, je doute sérieusement que vous avez besoin de la jointure en premier lieu.

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 .

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.


1 commentaires

Cette question concerne Oracle, de sorte que tout ce que vous pouvez faire dans une DB différente n'a pas d'importance



9
votes

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 )


2 commentaires

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 .