在我的Postgres数据库中,我想连接表A和表B以获得表C。表B被视为覆盖在表A上:
表A:“新”
| 身份证|新的|操作|
| - ------|- ------|- ------|
| 1个|新值1|插入|
| 第二章|新值2|更新|
表B“旧”
| 身份证|旧的|操作|
| - ------|- ------|- ------|
| 第二章|旧值2|更新|
| 三个|旧值3|删除|
表C“合并”
| 身份证|新的|旧的|操作|
| - ------|- ------|- ------|- ------|
| 1个|新值1|零|插入|
| 第二章|新值2|旧值2|更新|
| 三个|零|旧值3|删除|
SELECT
COALESCE(n.id, o.id), n.new, o.old,
COALESCE(n.operation, o.operation)
FROM
"new" n
FULL OUTER JOIN
old o ON n.id = o.id
我正在寻找更短的语法。有更好的解决方案吗?
1条答案
按热度按时间fkaflof61#
你可以用
USING
子句做一些事情:USING
子句中列出的列只包含在输出中 * 一次 ,因此SELECT
列表中未限定的id
有效地替换了COALESCE(n.id, o.id) AS id
。连接多个表时必须小心:左边的列名必须是明确的。
只有当相同的列名没有添加到右侧的另一个表中时,
SELECT
列表中的非限定引用才是可能的。这使得
USING
子句在以后修改查询时更容易被破坏,所以要小心使用。本手册:
...
JOIN USING
的输出抑制冗余列:不需要打印两个匹配的列,因为它们必须具有相等的值。JOIN ON
生成**T1
中的所有列,然后生成T2
中的所有列,而JOIN USING
则为列出的每个列对生成一个输出列(按列出的顺序),然后是T1
中的任何其余列,然后是T2
***中的任何其余列。但是对于其他列,您仍然需要
COALESCE
。并且您需要这些列的列别名(在您的示例中没有)。