假设你有一个表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
的功能与不具有相同名称的其他列结合起来?或者你被迫在最后一个例子中使用额外的冗长。
答案 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建议