SQL:在多个联接中引用JOIN LEFT列

时间:2018-12-16 23:10:24

标签: sql

注意:一个常见的问题是关于如何在SQL语言中进行多个联接。这不是如何进行多个联接的问题,而是如何在联接时引用列的问题

假设我们有三个表:

  1. TABLE x带有(a,b,...)列的
  2. TABLE y(b,c,...)列
  3. 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

2 个答案:

答案 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

因此,您不需要使用列别名。