2012-03-13 135 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