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。
是我哪里做错了还是我不知道关系划分是如何工作的?
在你最里面的子查询中,你得到了对 X
和 Y
错误的引用:
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;
我正在尝试使用 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。 是我哪里做错了还是我不知道关系划分是如何工作的?
在你最里面的子查询中,你得到了对 X
和 Y
错误的引用:
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;