【问题标题】:trouble understanding this EXISTS query无法理解此 EXISTS 查询
【发布时间】:2016-03-11 08:48:53
【问题描述】:

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 行,甚至没有任何与 parent 列匹配的 acc_code 记录。

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

查询(返回 6 行):

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

【问题讨论】:

  • Postgresql SQL Server。请正确标记或写下您需要可移植的代码。
  • 查询对双方都有效
  • 这里有NULLs 在玩吗?
  • 显然在其他记录中有parent 等于acc_code 的记录。您不是在一条记录中进行比较,而是在整个集合中进行比较。
  • 两列内没有NULLs

标签: sql-server postgresql exists


【解决方案1】:

假设你有以下集合:

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 在acc_id = 2 的记录中以parent 的形式存在。

为了在记录中搜索,您可以更改查询,例如:

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,所以这里描述的逻辑是相反的。

【讨论】:

  • 只是一个小问题,我现在有点理解它是如何工作的,但是当我们 UPDATESET acc_code WHERE acc_code=parent 时它会在您的示例表中更新 acc_id=5 吗?
  • 不,如果您只指定WHERE acc_code=parent,它只会更新该记录中acc_code = parent 的记录。在我的示例表中没有发生。
  • 谢谢,为了清楚起见,WHERE acc_code=parent 将仅在EXISTS 条件内检查整个记录集?
  • 这是正确的,除非您指定它应该在我显示的同一条记录中查找。
  • 谢谢,我终于不能发疯了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多