SQL查询以查找另一列中不存在ID的位置

Den*_*Liu 0 mysql sql t-sql sql-server

我有一张桌子:帐户

+-----------+-----------------+------+
| AccountNo | ParentAccountNo | name |
+-----------+-----------------+------+
|         1 | null            | ABC  |
|         2 | 1               | ABCD |
|         3 | 1               | CDE  |
|         4 | 2               | DEF  |
|         5 | null            | GHI  |
|         6 | 3               | MNO  |
|         7 | 5               | JKL  |
+-----------+-----------------+------+
Run Code Online (Sandbox Code Playgroud)

我需要获得AccountNo中不存在的结果ParentAccountNo

例如,根据上述数据,我期望的结果是:

+-----------+-----------------+------+
| AccountNo | ParentAccountNo | name |
+-----------+-----------------+------+
|         4 |               2 | DEF  |
|         6 |               3 | MNO  |
|         7 |               5 | JKL  |
+-----------+-----------------+------+
Run Code Online (Sandbox Code Playgroud)

将接受MySQL或的答案SQL-Server

Bri*_*oss 5

通过与加入表本身LEFT JOINAccountNo= ParentAccountNo,则可以过滤掉行,其中有没有匹配ID的。

WITH Accounts AS(
    SELECT *
    FROM (VALUES (1,null,'ABC'),
                 (2,1,'ABCD'),
                 (3,1,'CDE'),
                 (4,2,'DEF'),
                 (5,null,'GHI'),
                 (6,3,'MNO'),
                 (7,5,'JKL')) V(AccountNo,ParentAccountNo,name))


SELECT t1.* 
FROM Accounts t1
LEFT JOIN Accounts t2 ON t1.AccountNo = t2.ParentAccountNo
WHERE t2.AccountNo IS NULL
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

[这里演示]


您对的用法感到很好奇WITH。。。

这等效于我的速记用法WITH

CREATE TABLE Accounts (
    AccountNo INT NOT NULL,
    ParentAccountNo INT NULL,
    Name VARCHAR(200))

INSERT INTO Accounts
    SELECT *
    FROM (VALUES (1,null,'ABC'),
                 (2,1,'ABCD'),
                 (3,1,'CDE'),
                 (4,2,'DEF'),
                 (5,null,'GHI'),
                 (6,3,'MNO'),
                 (7,5,'JKL')) V(AccountNo,ParentAccountNo,name) 
Run Code Online (Sandbox Code Playgroud)