注意:一个常见的问题是关于如何在SQL语言中进行多个联接。这不是如何进行多个联接的问题,而是如何在联接时引用列的问题
假设我们有三个表:
TABLE
x带有(a,b,...)列的TABLE
y(b,c,...)列TABLE
z的列(c,d,...)其中a,b和c列是要加入的键。
然后,如果我们想为CREATE TABLE
中的每条记录z
t映射到x
中的a列,我们可以尝试使用顺序左联接(因为我们希望维护每个x中a的唯一实例)
分两个步骤:
-- step 1
FROM (
x
LEFT JOIN y
ON x.b = y.b
)
-- step 2
FROM (
y
LEFT JOIN z
ON y.c = z.c
)
尝试合并:
-- combined ?
FROM (
-- step 1
(
x
LEFT JOIN y
ON x.b = y.b
)
-- step 2
LEFT JOIN z
ON ??.c = z.c
)
由于表x中没有可与z连接的直接键,我是否仍可以使用y.b
还是需要使用别名,例如步骤1 AS s1
,然后s1.b
?
答案 0 :(得分:1)
我怀疑您想要
FROM x LEFT JOIN
y
ON x.b = y.b LEFT JOIN
z
ON z.b = x.b
首先,JOIN
操作是LEFT JOIN
,而不是JOIN LEFT
。
第二,您要加入x
表。为什么?您有一个LEFT JOIN
,并且y
中不匹配的行的y.b
值为NULL
。对于JOIN
来说那不是很好。因此,请使用第一个表中的值。
编辑:
对于修订后的问题,您别无选择:
FROM x LEFT JOIN
y
ON x.b = y.b LEFT JOIN
z
ON z.c = y.c
我不确定您在问什么。
答案 1 :(得分:1)
您实际上不需要嵌套查询或中间步骤。
标准解决方案是按照以下关系直接连接表:
SELECT x.a, x.b, z.c
FROM
x
LEFT JOIN y ON y.b = x.b
LEFT JOIN z ON z.c = y.c
因此,您不需要使用列别名。