我正在尝试比较同一个表中的两组数据以验证更新操作。我创建了这个查询来并排查看不同的信息集,但是当我在 WHERE
子句中添加一个额外的约束时,我得到了零行返回。
以下查询向我展示了彼此相邻的两个记录集,因此我可以通过观察发现存在不同的 componentid
:
WITH src AS
(SELECT id AS s_id,
moduleid AS s_moduleid,
instanceid AS s_instanceid,
tagid AS s_tagid,
componentid AS s_componentid
FROM component_junction WHERE id=103)
SELECT * FROM component_junction cj
JOIN src ON s_moduleid=cj.moduleid
AND s_instanceid=cj.instanceid
AND s_tagid=cj.tagid
WHERE cj.id=117
返回:
id | moduleid | instanceid | tagid | componentid | s_id | s_moduleid | s_instanceid | s_tagid | s_componentid
----|----------|------------|-------|-------------|------|------------|--------------|---------|--------------
117 | 2923 | 7179 | 1 | <null> | 103 | 2923 | 7179 | 1 | <null>
117 | 2923 | 7179 | 2 | <null> | 103 | 2923 | 7179 | 2 | <null>
117 | 2924 | 1404 | 1 | <null> | 103 | 2924 | 1404 | 1 | <null>
117 | 2924 | 1404 | 2 | <null> | 103 | 2924 | 1404 | 2 | <null>
117 | 1 | 41 | 2 | <null> | 103 | 1 | 41 | 2 | 267
117 | 1 | 40 | 2 | <null> | 103 | 1 | 40 | 2 | 267
117 | 1 | 38 | 2 | <null> | 103 | 1 | 38 | 2 | 267
但是下面的查询没有返回任何行。请注意末尾的额外 AND 子句:
WITH src AS
(SELECT id AS s_id,
moduleid AS s_moduleid,
instanceid AS s_instanceid,
tagid AS s_tagid,
componentid AS s_componentid
FROM component_junction WHERE id=103)
SELECT * FROM component_junction cj
JOIN src ON s_moduleid=cj.moduleid
AND s_instanceid=cj.instanceid
AND s_tagid=cj.tagid
WHERE cj.id=117 AND s_componentid != cj.componentid;
我知道这些值是不同的,因为我可以在第一个查询的结果集中看到它。 componentid
的两个集合中都存在一些 NULL 值,因此我希望这些值不会显示在第二个查询中。
最佳答案
一个或两个值似乎为 NULL
。 Postgres支持ANSI标准NULL
安全比较,所以改
s_componentid != cj.componentid
到:
s_componentid is distinct from cj.componentid
关于sql - 比较同一个表中的值集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46917128/