SQL 与 SQLite 的关系划分

Relational Division in SQL with SQLite

我正在尝试使用 this document and this question.

对以下 table(对荷兰语措辞表示抱歉)进行关系除法
    voedsel_id  dier_id
    1005        1006
    1004        1006
    1005        1005
    1005        1004
    1004        1004
    1001        1003
    1001        1002
    1001        1001

这让下面的查询成为我想做的事情。

SELECT DISTINCT dier_id
FROM Dieren_voedsel AS X
WHERE NOT EXISTS(
    SELECT voedsel_id
    FROM Dieren_voedsel AS Y
    WHERE Y.dier_id = 1006 AND NOT EXISTS(
        SELECT voedsel_id
        FROM Dieren_voedsel AS Z
        WHERE X.voedsel_id = Z.voedsel_id AND Y.dier_id = Z.dier_id
    )
)
ORDER BY dier_id;

导致以下意外输出。

dier_id
1004
1005
1006

我以为这个除法会输出所有 dier_id 元组,这些元组的 voedsel_id 值与 dier_id 1006 完全相同。但是,它包括 dier_id 1005,它只有 voedsel_id 1005 和 dier_id 1006 有 voedsel_id 1004 和 1005。我认为这只会 return dier_id 1004 和 1006。 是我哪里做错了还是我不知道关系划分是如何工作的?

在你最里面的子查询中,你得到了对 XY 错误的引用:

SELECT DISTINCT dier_id
FROM Dieren_voedsel AS X
WHERE NOT EXISTS(
    SELECT *
    FROM Dieren_voedsel AS Y
    WHERE Y.dier_id = 1006
      AND NOT EXISTS(
        SELECT *
        FROM Dieren_voedsel AS Z
        WHERE Z.dier_id = X.dier_id
          AND Z.voedsel_id = Y.voedsel_id
    )
)
ORDER BY dier_id;