postgresql SELECT列表中具有一个不同列的OUTER JOIN的简短语法

z9zf31ra  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(130)

在我的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

我正在寻找更短的语法。有更好的解决方案吗?

fkaflof6

fkaflof61#

你可以用USING子句做一些事情:

SELECT id                                               -- this is simpler now
     , n.new, o.old, 
     , COALESCE(n.operation, o.operation) AS operation  -- but not this
FROM   new n 
FULL   OUTER JOIN old o USING (id);                     -- !

USING子句中列出的列只包含在输出中 * 一次 ,因此SELECT列表中未限定的id有效地替换了COALESCE(n.id, o.id) AS id
连接多个表时必须小心:左边的列名必须是明确的。
只有当相同的列名没有添加到右侧的另一个表中时,SELECT列表中的非限定引用才是可能的。
这使得USING子句在以后修改查询时更容易被破坏,所以要小心使用。
本手册:
... JOIN USING的输出抑制冗余列:不需要打印两个匹配的列,因为它们必须具有相等的值。JOIN ON生成
**T1中的所有列,然后生成T2中的所有列,而JOIN USING则为列出的每个列对生成一个输出列(按列出的顺序),然后是T1中的任何其余列,然后是T2***中的任何其余列。
但是对于其他列,您仍然需要COALESCE
并且您需要这些列的列别名(在您的示例中没有)。

相关问题