2017-09-30 4 views
0

Disons que j'ai la table SQL suivante employee, et que vous voulez répondre à la question "qui habite au même endroit que Joe (à part Joe lui-même)?" à l'aide d'un auto-jointure:Comment filtrer la valeur nécessaire dans l'instruction WHERE en auto-jointure dans SQL

| name | location | 
|---------|-----------| 
| Joe  | New York | 
| Sunil | India  | 
| Bob  | New York | 
| Melissa | Kentucky | 

Pour répondre à la question que je pourrais écrire:

SELECT employee_name 
FROM (
SELECT DISTINCT e1.name as employee_name 
FROM employee e1 
JOIN employee e2 ON e1.location = e2.location 
WHERE e2.name = "Joe" 
) 
WHERE employee_name <> "Joe" 

Y at-il un moyen d'obtenir ce résultat en utilisant une seule déclaration SELECT? Je ne sais pas s'il y a un moyen.

+3

Ajoutez 'e1.name <> e2.name' dans la condition de jointure. –

Répondre

1

Vous pouvez filtrer "Joe" de la résultante table jointe à une condition supplémentaire dans la clause WHERE:

SELECT DISTINCT e1.name as employee_name 
FROM employee e1 
JOIN employee e2 ON e1.location = e2.location 
WHERE e2.name = "Joe" 
    AND e1.name <> "Joe" -- remove row where "Joe" matches to "Joe" 
+0

Cela fonctionne, bien que l'utilisation de 'e1.name <> e2.name' soit plus lisible par l'homme à mon avis –

0

Est-ce qu'une corrélation. Excuses sur le code, je le fais sur mon iPhone.

SELECT DISTINCT NAME FROM EMPLOYEE 
WHERE NAME IN ( 
     SELECT DISTINCT LOCATION FROM EMPLOYEE 
     WHERE NAME = 'Joe') 
And name != 'Joe'