[英]SQL LEFT JOIN ON A SINGLE TABLE
假设表:
MyTable
idPrimary idPerson idSchool
-----------------------------------
1 20 6
2 20 3
3 21 2
4 22 6
5 23 6
6 24 3
7 22 7
我想找到所有上过6号学校但没有上2号或3号学校的人。这意味着从上表中可以看出,答案是22和23号学生。20号学生去了6号学校,可惜去了到学校3,从而否定了这个学生。
根据问题38549中的矩阵,我希望LEFT JOIN WHERE B.Key为NULL。
(出于好奇,这就是所谓的LEFT OUTER JOIN?)
主要公式为:
SELECT <SELECT_LIST> FROM TableA.A LEFT JOIN TableB.B ON A.Key = B.Key WHERE B.Key IS NULL;
表A为:
SELECT * FROM `MyTable` WHERE `idSchool` = '6';
表B为:
SELECT * FROM `MyTable` WHERE `idSchool` = '2' OR `idSchool` = '3';
结果表应为:
SELECT `idPerson` FROM SELECT * FROM `MyTable` WHERE `idSchool` = '6' LEFT JOIN SELECT * FROM `MyTable` WHERE `idSchool` = '2' OR `idSchool` = '3' ON `idSchool` = `idSchool` WHERE `idSchool` = NULL;
可悲的是,MySQL Workbench向我抛出一个错误:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
在LEFT JOIN附近,因此基本上SQL引擎不喜欢我的TableA。 如果将TableA括在括号中,则会出现别名错误。
发出此查询的正确方法是什么?
进行LEFT JOIN,检查ON子句中不需要的学校,并检查WHERE子句中是否没有匹配项:
SELECT DISTINCT a.idPrimary, a.idPerson, a.idSchool
FROM MyTable a
LEFT OUTER JOIN MyTable b
ON a.idPerson = b.idPerson
AND b.idSchool IN (2,3)
WHERE a.idSchool = 6
AND b.idSchool IS NULL
将AS
关键字用作表别名:
SELECT <SELECT_LIST>
FROM TableA AS A
LEFT JOIN TableB AS B ON A.Key = B.Key
WHERE B.Key IS NULL;
JOIN的语法更像是:
SELECT *
FROM someTable
LEFT JOIN ON someOtherTable ON (someTable.someColumn = someOtherTable.someOtherColumn)
WHERE
someTable.id = 1;
但是,在您的情况下,我认为“ NOT EXISTS
看起来更加清晰:
SELECT t1.*
FROM `MyTable` t1
WHERE t1.`idSchool` = '6'
AND NOT EXISTS (
SELECT t2.idPerson
FROM MyTable t2
WHERE t2.idSchool IN (2,3) AND t2.idPerson = t1.idPerson);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.