有没有办法将Postgresql与其他条款结合使用?

时间:2018-05-25 12:42:29

标签: sql postgresql

假设你有一个表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而使用id1 postgres抱怨id1不明确,尽管因为您使用{{1}该列不能含糊不清。

是否有任何方法可以将INNER JOIN的功能与不具有相同名称的其他列结合起来?或者你被迫在最后一个例子中使用额外的冗长。

2 个答案:

答案 0 :(得分:3)

您可以使用子查询,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

答案 1 :(得分:1)

如果其中一个表中包含少量列,则可以对列进行别名,以使连接列在每个表中具有相同的名称。例如:

WITH tablea (a, b, c1) AS (
VALUES (1, 'x', 'y')
     , (2, 'x', 'z')
     , (3, 'y', 'z')
), tableb (a,b,c2) AS (
VALUES (1, 'x', 'y')
     , (2, 'x', 'z')
     , (3, 'y', 'z')
)
SELECT * 
FROM tablea AS t(a,b,c2)
JOIN tableb USING (a, b, c2)

但是,我建议将where条款中的第三个条件设为Gordon Linoff& dnoeth建议