簡體   English   中英

SQL左連接在單個表上

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM