[英]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.