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 JOIN
并INNER 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
也找到时才包含在内。
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)
在你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)
我终于弄明白了.感谢你的帮助!!!
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)
如果您只想添加内部联接,请执行此操作。您可以在同一查询中添加任意数量的联接。如果这不是您想要的,请更新您的答案
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)