无法理解这个EXISTS查询

时间:2016-03-11 08:48:53

标签: sql-server postgresql exists

acc_account示例数据:

acc_id  acc_code  parent  name
------- --------- ------ ------
 1     | aaa     |  -1  |  A   |
 2     | bbb     |  CP  |  B   |
 3     | ccc     |  OP  |  C   |
 4     | ddd     |  -1  |  D   |

acc_codeparent是否相等?

该表格有411行,甚至没有acc_codeparent列匹配的记录。

然而,下面的这个查询在它应该是所有411行时返回6行。 谁能解释一下?

查询(返回6行):

   SELECT *
    FROM acc_account a1
    WHERE not EXISTS (
        SELECT *
        FROM acc_account
        WHERE acc_account.parent = a1.acc_code
   );

1 个答案:

答案 0 :(得分:3)

假设您有以下内容:

acc_id  acc_code  parent  name
------- --------- ------ ------
 1     | aaa     |  -1  |  A   |
 2     | bbb     |  CP  |  B   |
 3     | ccc     |  OP  |  C   |
 4     | ddd     |  -1  |  D   |
 5     | CP      |  -1  |  E   |

您的查询会返回acc_id = 5的记录,因为acc_code = CP在parent = 2的记录中以acc_id的形式存在。

为了在记录中进行搜索,您可以改变查询,如:

SELECT *
FROM acc_account a1
WHERE not EXISTS (
                   SELECT *
                   FROM acc_account
                   WHERE acc_account.parent = a1.acc_code
                       AND acc_account.id = a1.id
                 );

或者更简单:

SELECT *
FROM acc_account a1
WHERE a1.parent = a1.acc_code

编辑我刚刚发现你正在寻找NOT exists,所以这里描述的逻辑是相反的。