在同一查询中使用左连接和内连接

Wil*_*ill 18 sql ms-access inner-join left-join

下面是我的查询使用左连接按预期工作.我想要做的是进一步添加另一个表过滤此查询,但是这样做有困难.我将调用这个新表,table_3并希望添加到哪里table_3.rwykey = runways_updatable.rwykey.任何帮助将非常感谢.

SELECT * 
FROM RUNWAYS_UPDATABLE 
LEFT JOIN TURN_UPDATABLE 
ON RUNWAYS_UPDATABLE.RWYKEY = TURN_UPDATABLE.RWYKEY 
WHERE RUNWAYS_UPDATABLE.ICAO = 'ICAO'
AND (RUNWAYS_UPDATABLE.TORA > 4000 OR LDA > 0) 
AND (TURN_UPDATABLE.AIRLINE_CODE IS NULL OR TURN_UPDATABLE.AIRLINE_CODE = '' 
OR TURN_UPDATABLE.AIRLINE_CODE = '') 
Run Code Online (Sandbox Code Playgroud)

' *************编辑为CLARIFY***************** 这是我想要使用的内连接的另一个语句,我想结合这两个语句.

SELECT * 
FROM RUNWAYS_UPDATABLE A, RUNWAYS_TABLE B
WHERE A.RWYKEY = B.RWYKEY
Run Code Online (Sandbox Code Playgroud)

' ***到目前为止,我所掌握的建议,但是语法错误

     SELECT RUNWAYS_UPDATABLE.*, TURN_UPDATABLE.*,  AIRPORT_RUNWAYS_SELECTED.* 
     FROM RUNWAYS_UPDATABLE
       INNER JOIN  AIRPORT_RUNWAYS_SELECTED 
          ON RUNWAYS_UPDATABLE.RWYKEY = AIRPORT_RUNWAYS_SELECTED.RWYKEY
     LEFT JOIN TURN_UPDATABLE
          ON RUNWAYS_UPDATABLE.RWYKEY = TURN_UPDATABLE.RWYKEY 
Run Code Online (Sandbox Code Playgroud)

注意:如果我注释掉内连接并离开左连接,反之亦然,它可以工作,但是当我在查询中有两个连接时,那就是当我得到语法错误时.

Gaj*_*jus 36

在寻找如何使LEFT JOIN依赖进一步时,我总是遇到这个问题INNER JOIN。这是我在搜索“使用LEFT JOININNER JOIN在同一查询中”时搜索的示例:

SELECT *
FROM foo f1
LEFT JOIN (bar b1
  INNER JOIN baz b2 ON b2.id = b1.baz_id
) ON
  b1.id = f1.bar_id
Run Code Online (Sandbox Code Playgroud)

在此示例中,b1仅当b2也找到时才包含在内。

  • 很高兴几年前发布了这篇文章。继续回来吧哈哈 (4认同)
  • 哇,从来不知道!! (2认同)
  • 感激不尽;坐了最后 2 个小时,正要重构代码时,遇到了你巧妙的左/内连接技巧 - 靶心! (2认同)

Nik*_*vić 19

请记住,在左连接中过滤右侧表应该在连接本身中完成.

select *
from table1 
  left join table2
    on table1.FK_table2 = table2.id
    and table2.class = 'HIGH'
Run Code Online (Sandbox Code Playgroud)

  • @robertking否,返回的行数可能不同,因为`table2.class`可能首先包含空值.加入条件会过滤掉它们,而条件会包含它们.此外,如果使用连接条件,则将返回table1中的所有行,其中condition将从table1中排除行,这些行在table2中没有对应的行,其中`class为null或class ='HIGH'`. (2认同)

Tra*_*ty3 6

在你INNER_JOIN之前添加你的LEFT JOIN:

  SELECT * 
  FROM runways_updatable ru
    INNER JOIN table_3 t3 ON ru.rwykey = t3.rwykey
    LEFT JOIN turn_updatable tu
      ON ru.rwykey = tu.rwykey
      AND (tu.airline_code IS NULL OR tu.airline_code = '' OR tu.airline_code = '')
  WHERE ru.icao = 'ICAO'
    AND (ru.tora > 4000 OR ru.lda > 0)
Run Code Online (Sandbox Code Playgroud)

如果您LEFT JOIN在您之前INNER JOIN,那么table_3如果没有匹配的行,您将无法获得结果turn_updatable.这可能是你想要的,但由于你table_3只有引用的连接条件runways_updatable,我会假设你想要一个结果table_3,即使没有匹配的行turn_updatable.

编辑:

正如@NikolaMarkovinović指出的那样,你应该LEFT JOIN在连接条件中过滤你自己,如上所示.否则,runways_updatable如果右侧表()中未满足该条件,则不会从左侧table()获得结果turn_updatable.


编辑2:OP提到这实际上是Access,而不是MySQL

在Access中,也许这是表别名的差异.试试这个:

  SELECT [ru].*, [tu].*, [ars].*
  FROM [runways_updatable] AS [ru]
    INNER JOIN [airport_runways_selected] AS [ars] ON [ru].rwykey = [ars].rwykey
    LEFT JOIN [turn_updatable] AS [tu]
      ON [ru].rwykey = [tu].rwykey
      AND ([tu].airline_code IS NULL OR [tu].airline_code = '' OR [tu].airline_code = '')
  WHERE [ru].icao = 'ICAO'
    AND ([ru].tora > 4000 OR [ru].lda > 0)
Run Code Online (Sandbox Code Playgroud)


Wil*_*ill 6

我终于弄明白了.感谢你的帮助!!!

SELECT * FROM 
(AIRPORT_RUNWAYS_SELECTED 
 INNER JOIN RUNWAYS_UPDATABLE 
 ON AIRPORT_RUNWAYS_SELECTED.RWYKEY = RUNWAYS_UPDATABLE.RWYKEY) 
LEFT JOIN TURN_UPDATABLE ON RUNWAYS_UPDATABLE.RWYKEY = TURN_UPDATABLE.RWYKEY
Run Code Online (Sandbox Code Playgroud)


Jus*_*ony 1

如果您只想添加内部联接,请执行此操作。您可以在同一查询中添加任意数量的联接。如果这不是您想要的,请更新您的答案

  SELECT * 
  FROM RUNWAYS_UPDATABLE 
  LEFT JOIN TURN_UPDATABLE 
  ON RUNWAYS_UPDATABLE.RWYKEY = TURN_UPDATABLE.RWYKEY 
  INNER JOIN table_3
  ON table_3.rwykey = runways_updatable.rwykey
  WHERE RUNWAYS_UPDATABLE.ICAO = 'ICAO'
  AND (RUNWAYS_UPDATABLE.TORA > 4000 OR LDA > 0) 
  AND (TURN_UPDATABLE.AIRLINE_CODE IS NULL OR TURN_UPDATABLE.AIRLINE_CODE = '' 
  OR TURN_UPDATABLE.AIRLINE_CODE = '') 
Run Code Online (Sandbox Code Playgroud)