Question

Lorsque vous effectuez une jointure gauche dans TSQL (serveur MSSQL) est-il une garantie que la ligne sera de retour avec votre requête s'il y a plusieurs lignes à droite?

Je suis en train de l'utiliser pour exploiter un ordre sur la table de droite.

Select ColA, ColB, ColC 
from T
Left Outer Join 
   (Select ColA, ColB, ColC 
   from T--CLARIFIED, this is a self join.
   Order by TopColumn Desc) AS OrderedT(ColA, ColB, ColC) 
   On T.ColA = OrderedT.ColA

Je me attends à récupérer tous de la ColA dans le tableau, et toute la première ligne de l'ensemble des résultats pour COLA ma gauche se joindre à la base de mon ordre.

Y at-il fait garantie par ce langage ou d'un serveur?

Était-ce utile?

La solution

Je crois que vous en avez besoin ...

select T.ColA, T.ColB, T.ColC 
from T
inner join
   (select ColA, max(TopColumn) MaxTopColumn
   from T
   group by ColA) OrderedTable
   on T.ColA = OrderedTable.ColA and T.TopColumn = OrderedTable.MaxTopColumn

requête assez commune pour les tables versionnées, nécessite une jointure interne à une requête max.

Le nom de la table "Table" ne facilite pas les choses, je l'ai rebaptisèrent T.

Autres conseils

Pas si simple. La LEFT JOIN renvoie toutes les lignes concordante droite. La question sur la garantie n'est pas vraiment pertinent ici. Il faudrait faire quelque chose avec une sous-requête pour obtenir la seule ligne dont vous avez besoin, en utilisant TOP 1 dans la sous-requête.

A LEFT JOIN renvoie toutes les lignes de la main gauche satisfaisant ANY critères indépendamment du fait que il y a une ligne correspondante à droite (sur la clé de jointure (s)). Les colonnes de la table de droite seront retournées NULL où il n'y a pas de correspondance sur clé de jointure.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top