8
votes

Comment les valeurs constantes effectuent-elles la clause de jointures?

J'ai récemment découvert que la clause d'une jointure gauche peut contenir des valeurs telles que (1 = 1).

Cela me bouleverse, car il brise ma perception de la fonction de jointure.

J'ai rencontré une version plus élaborée de la situation suivante: xxx

C'est parfaitement légal. Qu'est-ce que "manager.id = -1" accomplit, si quelque chose? Comment cela peut-il effectuer la jointure?


1 commentaires

Je suis venu sur cette page avec la même question. Vous mentionnez que l'expression sur une constante est "parfaitement légale". Comment avez-vous déterminé cela? Êtes-vous en train de dire que c'est "légal" (sanctionné par une spécification) ou qu'il arrive tout simplement travail dans une mise en œuvre donnée?


3 Réponses :


5
votes

Sauf si une ligne dans la table du gestionnaire où l'ID est égal à -1, il ne fait rien du tout. S'il y a une telle ligne, cette rangée sera toujours jointe à chaque rangée de la table de la personne. Donc, pour chaque rangée de la personne, vous recevriez potentiellement deux ROS dans la sortie de requête, une avec manager.id = à l'ID des personnes, et une autre avec le gestionnaire.Id = -1 rangée


1 commentaires

Plus simple que ce que j'avais imaginé. Merci.



7
votes

Si la table de la personne est la suivante: xxx pré>

si la table du gestionnaire est p> xxx pré>

si la requête est la suivante: p>

Person One  -1  Admin
Person Two  -1  Admin
Person Two  2   Manager One
Person Three    -1  Admin
Person Three    3   Manager Two
Person Four -1  Admin
Person Five -1  Admin


1 commentaires

"personne quatre" manquante gaspillée mes 5 minutes :)



5
votes

Vous verrez également la clause et la clause utilisée pour filtrer davantage les enregistrements. Ceci est extrêmement important dans la gestion des jointures extérieures, comme l'ajout de ces actions de filtrage à la clause où la clause allumera la jointure d'une jointure gauche à une jointure intérieure (sauf si c'est quelque chose comme si T.Idfield est null).

ci-dessous je montre Comment cela fonctionne et pourquoi il est important de placer les clauses de filtrage au bon endroit. p>

Créer une table #TEST (Test1ID Int, Test Varchar (10)) Créer une table # Test2 (Test2ID Int, Test1Id int, Test2 Varchar (10)) P>

select * from #test t
left join #test2 t2 on t.test1id = t2.test1id
where test2id is null
--result set 
--test1id   test    test2id test1id test2
--3 Nathan  NULL    NULL    NULL


0 commentaires