2012-03-13 8 views
10

Poniżej znajduje się moje zapytanie za pomocą lewego sprzężenia, które działa zgodnie z oczekiwaniami. Co chcę zrobić, to dodać kolejną tabelę filtrowania tego zapytania dalej, ale mając problem z tym. Nazwę tę nową tabelę table_3 i chcę dodać, gdzie table_3.rwykey = runways_updatable.rwykey. Każda pomoc będzie bardzo doceniana.Korzystanie z łączenia lewego i łączenia wewnętrznego w tym samym zapytaniu

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

'* ** * ** * ** * ***EDIT celu wyjaśnienia ** * ** * ** * ** * ** * ** Oto inne stwierdzenie, z którym chciałbym skorzystać, i chciałbym połączyć te 2 wypowiedzi.

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

'* * * Co mam dotąd jako porady podjętej poniżej, ale coraz błąd składni

 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 

UWAGA: Jeśli mogę wypowiedzieć się wewnętrzna dołączyć i opuścić LEFT JOIN lub vice versa, działa, ale gdy mam oba sprzężenia w zapytaniu, to gdy otrzymuję błąd składni.

+0

Czy możesz nam powiedzieć, na czym polega problem? Co otrzymujesz i czego oczekujesz? – botzko

Odpowiedz

1

Jeśli jest to tylko połączenie wewnętrzne, które chcesz dodać, zrób to. Możesz dodać tyle złączeń, ile chcesz w tym samym zapytaniu. Proszę zaktualizować swoją odpowiedź, jeśli nie jest to, co chcesz, choć

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

Dzięki za odpowiedź na to pytanie, ale Twoja odpowiedź nie zadziałała. Otrzymuję błąd składni stwierdzający: Brak operatora w wyrażeniu zapytania. – Will

+0

Teraz, gdy mówisz, że to jest dostęp, założę się, że to pochodzi z czegoś innego w twojej konfiguracji. Czy możesz spróbować uruchomić powyższą kwerendę bezpośrednio (jak napisano ... nie logika z dostępu), czy jest to, co próbujesz? –

3

Dodaj swoje INNER_JOIN przed swój 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) 

Jeśli LEFT JOIN przed swoimi INNER JOIN, to nie dostanie wyników z table_3 jeżeli nie ma zgodnego wiersza w turn_updatable. Możliwe, że tego właśnie chcesz, ale ponieważ twój warunek łączenia dla table_3 odnosi się tylko do runways_updatable, zakładam, że chcesz uzyskać wynik z table_3, nawet jeśli nie ma pasującego wiersza w turn_updatable.

EDIT:

Jako @ NikolaMarkovinović wskazał, należy filtrować LEFT JOIN w samym warunkiem przyłączenia, jak widać powyżej. W przeciwnym razie nie uzyskasz wyników z lewej strony tabeli (runways_updatable), jeśli ten warunek nie jest spełniony w tabeli po prawej stronie (turn_updatable).


EDIT 2 OP wspomniano jest to faktycznie Access, a nie MySQL

W programie Access, być może jest to różnica w aliasów tabel.Spróbuj zamiast tego:

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

Dzięki za odpowiedź na to pytanie, ale Twoja odpowiedź nie zadziałała. Otrzymuję błąd składni stwierdzający: Brak operatora w wyrażeniu zapytania. To co zrobiłem to zastąpienie table_3 tabelą_3 i otrzymałem ten błąd – Will

+0

@Will: Z jakiej wersji MySQL korzystasz? Nie widzę żadnych błędów składniowych w żadnej z zamieszczonych tu odpowiedzi. – Travesty3

+0

Używam dostępu – Will

1

Nie jestem pewien, czego chcesz. Ale może coś takiego:

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

dziękuję za próbę odpowiedzi na moje pytanie, ale otrzymuję komunikat o błędzie: błąd składni w klauzuli FROM – Will

+0

Spróbuj zmienić "SELECT *" na "SELECT RUNWAYS_UPDATABLE. *, TURN_UPDATABLE. *' - błąd może być spowodowany przez zduplikowane nazwy kolumn w table_3 . –

+0

Dobra wiadomość. Zaktualizowano odpowiedź – Arion

13

Pamiętaj, że filtrowanie tabeli po prawej stronie w lewym złączeniu powinno być wykonane w samym łączeniu.

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

+1 Bardzo dobry punkt. – Travesty3

+0

Aby wyjaśnić, czy można również przejść: gdzie table2.class = 'HIGH' LUB table2.class ma wartość null; –

+2

@robertking Nie, liczba zwróconych wierszy może być różna, ponieważ 'table2.class' może zawierać wartości null w pierwszej kolejności. Warunek dołączenia odfiltrowałby je, gdy warunek obejmowałby je. Ponadto, gdy wszystkie wiersze z tabeli 1 zostaną zwrócone, jeśli zostanie użyty warunek łączenia, warunek wyklucza wiersze z tabeli 1, które nie mają odpowiedniego wiersza w tabeli 2, gdzie 'class ma wartość null lub class = 'HIGH''. –

3

W końcu to rozgryzłem. Dzięki za twoją pomoc !!!

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 
Powiązane problemy