【发布时间】:2018-02-17 10:19:32
【问题描述】:
我想在 SQL (postgres) 中比较两个表的内容。这些表具有匹配的架构。作为输出,我想要那些不同的行。 我已经检查了各种方法(也有一些在 Stackoverflow 上发布),但在我看来,当两列中的字段均为 NULL 时,我遇到了问题。到目前为止,这是我想出的:
SELECT dipi.id AS dipi_id,dipi.foo AS dipi_foo,dipi.bar AS dipi_bar, rvdii.id AS rvdii_id,rvdii.foo AS rvdii_foo,rvdii.bar AS rvdii_bar
FROM schema1.mytable dipi
FULL OUTER JOIN schema2.mytable rvdii on dipi.id = rvdii.id AND dipi.foo = rvdii.foo AND dipi.bar = rvdii.bar
WHERE dipi.id is null or rvdii.id is null
因此,对所有列进行完全外连接,然后返回其中一个 ID 为空的列。
但是通过这个查询,我得到了一些示例数据:
dipi_id dipi_foo dipi_bar rvdii_id rvdii_foo rvdii_bar 3 2016-01-01 NULL NULL NULL NULL NULL NULL NULL 3 2016-01-01 NULL如您所见,“dipi_bar”、“rvdii_bar”列包含一个空值,在连接中不匹配(据我了解)。因此,在上述情况下,我不想要任何输出,我希望当两个列/字段都为 NULL 时,它们在连接中得到“匹配”(或在连接中被忽略,不管怎样)。这样做的诀窍是什么?
编辑:当然该列并不总是空的,所以从连接中删除不是一个选项:)
【问题讨论】:
-
如果我理解您的请求权,应该尝试与
IS NOT DISTINCT FROM结合使用自然加入,例如。 G。dipi.foo IS NOT DISTINCT FROM rvdii.foo等 -
好主意,看起来这对于 postgres 是不可能的:“错误:FULL JOIN 仅支持可合并或可哈希连接的连接条件”我会尝试其他答案。
-
Ups,我写的很自然,但我的意思是 inner join,但我不建议使用 full outer join。
标签: sql postgresql