SQL与SQLite的关系划分

时间:2017-04-09 11:18:16

标签: sql sqlite relational-division

我正试图使用​​this documentthis question对下表进行关系划分(抱歉荷兰语措辞)。

    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 1006具有完全相同的voedsel_id值的dier_id元组。但是,它包括dier_id 1005,它只有voedsel_id 1005而dier_id 1006有voedsel_id 1004和1005.我认为这只会返回dier_id 1004和1006。 有没有我做错了或者我不知道关系师如何运作?

1 个答案:

答案 0 :(得分:4)

在您最里面的子查询中,您得到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;