【问题标题】:SQL query to find where ID does not exist in another columnSQL查询以查找另一列中不存在ID的位置
【发布时间】:2018-03-16 03:14:56
【问题描述】:

我有一张表:帐户

+-----------+-----------------+------+
| AccountNo | ParentAccountNo | name |
+-----------+-----------------+------+
|         1 | null            | ABC  |
|         2 | 1               | ABCD |
|         3 | 1               | CDE  |
|         4 | 2               | DEF  |
|         5 | null            | GHI  |
|         6 | 3               | MNO  |
|         7 | 5               | JKL  |
+-----------+-----------------+------+

我需要得到AccountNo 不存在于ParentAccountNo 中的结果。

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

+-----------+-----------------+------+
| AccountNo | ParentAccountNo | name |
+-----------+-----------------+------+
|         4 |               2 | DEF  |
|         6 |               3 | MNO  |
|         7 |               5 | JKL  |
+-----------+-----------------+------+

将接受MySQLSQL-Server 的答案。

【问题讨论】:

  • 你是怎么得到 4、6 和 7 的?表中存在父 ID 2、3 和 5。
  • 我已经编辑了这个问题。结果将:4,6,7
  • mysqlsql-server 是哪个?
  • 我需要看看它们的不同之处。所以两者都可以。但更喜欢 SQL SERVER
  • @anonyXmous 4,6,7 在 parentAccountNo 表中没有任何孩子。 4,6,7 在 parentAccountNo 中没有任何值

标签: mysql sql sql-server tsql


【解决方案1】:

通过在AccountNo = ParentAccountNo 上使用LEFT JOIN 将表连接到自身,您可以过滤掉没有匹配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

[DEMO HERE]


您对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) 

【讨论】:

  • 这只是我创建示例数据而不是 CREATE TABLE. . . 然后做 INSERT INTO. . . 的快速方法
  • 是的,我的意思是。但我不明白为什么我得到-1 downvote :(
  • 谢谢布赖恩。它帮助我解决了现在工作中的问题:)。我什至不认为用 join 过滤同一个表来获得行。
  • @Emdad - 结果没有变化。您也可以在t2.ParentAccountNo 上检查null。请查看我的DEMO HERE 链接并尝试一下。您也可以检查 t2.Name IS NULL 并得到相同的结果。
  • 感谢您的良好合作。
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
相关资源
最近更新 更多