首页 > 解决方案 > 有没有办法将 Postgresql 的 using 与附加子句结合起来?

问题描述

假设您有一个表 A 和 B:

CREATE TABLE A (
   id1
   id2
   creationDate
   ...
);

CREATE TABLE B (
   id1
   id2
   lastUsedDate
   ...
);

您想要执行一个将这两个表连接在一起的选择,但是,您想要连接的其中一个列的名称与另一列不同。

如果您只想加入前两列,则可以执行此查询:

SELECT 
     id1
   , id2
   , ...
FROM A
JOIN B using(id1, id2)
;

但是,如果您还想加入日期,则必须执行此查询:

SELECT 
     a.id1
   , a.id2
   , ...
FROM A a
JOIN B b ON 
        a.id1=b.id1
    AND a.id2=b.id2
    AND a.creationDate=b.lastUsedDate
;

这个查询要冗长得多,如果你省略a.id1而是使用id1postgres 会抱怨这id1是模棱两可的,尽管事实上你使用的INNER JOIN是列不能模棱两可。

有什么方法可以将功能using()和不共享相同名称的附加列结合起来?或者您是否被迫在最后一个示例中使用额外的冗长。

标签: sqlpostgresql

解决方案


您可以使用子查询、CTE 或横向连接来添加等效命名的列:

FROM A a JOIN
     (SELECT b.*, lastUsedDate as creationDate
      FROM B b
     ) b
     USING (id1, id2, creationDate)

WHERE或者在子句中添加额外的条件:

FROM A a JOIN
     B b
     USING (id1, id2)
WHERE a.creationDate = b.lastUsedDate

推荐阅读