2012-03-13 207 views
10

以下是使用左连接的查询,该连接按预期工作。我想要做的是添加另一个表格过滤此查询进一步,但有麻烦这样做。我会将这个新表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 = '') 

* ** * ** * ** * ***编辑澄清 ** * ** * ** * ** * ** * ** 以下是我希望使用的内部连接的其他声明,我希望将这两个声明组合在一起。

SELECT * 
FROM RUNWAYS_UPDATABLE A, RUNWAYS_TABLE B 
WHERE A.RWYKEY = B.RWYKEY 

* * *我有这么远的建议如下考虑,但得到的语法错误

 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 

注:如果我注释掉内加入和离开左连接或反之亦然,它的工作原理,但是当我在查询中有两个连接时,即时获取语法错误。

+0

你能告诉我们什么是问题吗?你收到了什么,你期望什么? – botzko 2012-03-13 13:53:04

回答

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 = '') 
+0

感谢您试图回答这个问题,但您的答案无效。我得到一个语法错误,说明:在查询表达式中缺少运算符。 – Will 2012-03-13 14:24:16

+0

既然你说这是访问,我敢打赌这是来自你的设置中的其他东西。你可以尝试直接运行上面的查询(如书面..没有逻辑从访问),或者是你正在尝试? – 2012-03-13 15:15:55

3

添加您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) 

如果LEFT JOIN之前,请从table_3如果INNER JOIN,那么你就不会得到结果turn_updatable中没有匹配的行。这可能是你想要的,但由于你的加入条件table_3只引用runways_updatable,我假设你想从table_3得到结果,即使turn_updatable中没有匹配的行。

编辑

正如@NikolaMarkovinović指出,应在连接条件本身筛选LEFT JOIN,当你看到上面。否则,如果在右侧表格(turn_updatable)中未满足该条件,则不会从左侧表格(runways_updatable)获得结果。


编辑2:OP提到这实际上是访问,而不是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) 
+0

感谢您试图回答这个问题,但您的答案无效。我得到一个语法错误,说明:在查询表达式中缺少运算符。我所做的是将table_3替换为table_3,并收到该错误 – Will 2012-03-13 14:34:43

+0

@Will:您使用的是哪个版本的MySQL?我在这里发布的任何答案中都没有看到任何语法错误。 – Travesty3 2012-03-13 14:46:38

+0

我正在使用访问 – Will 2012-03-13 14:50:36

1

我不是很确定你想要什么。但也许是这样的:

SELECT RUNWAYS_UPDATABLE.*, TURN_UPDATABLE.* 
FROM RUNWAYS_UPDATABLE 
JOIN table_3 
    ON table_3.rwykey = runways_updatable.rwykey 
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 = '') 
+0

谢谢你试图回答我的问题,但我得到一个错误,指出:在FROM子句中的语法错误 – Will 2012-03-13 14:31:09

+0

尝试将'SELECT *'更改为'SELECT RUNWAYS_UPDATABLE。*,TURN_UPDATABLE。*' - 错误可能是由table_3上重复的列名引起的。 – 2012-03-13 14:49:41

+0

不错的通知。更新了答案 – Arion 2012-03-13 14:53:00

13

请记住,过滤左连接中的右侧表应该在连接中完成。

select * 
from table1 
    left join table2 
    on table1.FK_table2 = table2.id 
    and table2.class = 'HIGH' 
+0

+1非常好的一点。 – Travesty3 2012-03-13 13:59:17

+0

为了澄清,你还可以去: where table2.class ='HIGH'OR table2.class is null; – 2016-02-16 20:51:47

+2

@robertking不,返回的行数可能不同,因为'table2.class'可能首先包含空值。加入条件会过滤出来,而条件会包含它们。而且,如果使用连接条件,则将返回table1中的所有行,其中condition将排除table1中没有相应行的table2中的行,其中class为null或class ='HIGH'。 – 2016-02-17 11:53:21

3

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

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