2012-03-13 4 views
10

Di seguito è la mia query utilizzando un join di sinistra che funziona come previsto. Quello che voglio fare è aggiungere un'altra tabella per filtrare ulteriormente questa query, ma avendo problemi a farlo. Chiamerò questa nuova tabella table_3 e voglio aggiungere dove table_3.rwykey = runways_updatable.rwykey. Qualsiasi aiuto sarebbe molto apprezzato.Utilizzo di join sinistro e inner join nella stessa query

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 chiarire ** * ** * ** * ** * ** * ** Ecco l'altra affermazione che join interno vorrei usare e vorrei combinare queste due affermazioni.

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

'* * * Quello che ho finora come consiglio preso sotto, ma ottenere errore di sintassi

 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 

NOTA: Se io commento uniscono l'interno e lasciare a sinistra unirsi o viceversa, funziona, ma quando ho entrambi i join nella query, questo è quando sto ottenendo l'errore di sintassi.

+0

E puoi dirci qual è il problema? Cosa ricevi e cosa ti aspetti? – botzko

risposta

1

Se è solo un join interno che si desidera aggiungere, eseguire questa operazione. È possibile aggiungere tutti i join desiderati nella stessa query. Si prega di aggiornare la vostra risposta, se questo non è ciò che si vuole, anche se

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

Grazie per aver cercato di rispondere a questo, ma la tua risposta non ha funzionato. Sto ottenendo un errore di sintassi affermando: Operatore mancante nell'espressione di query. – Will

+0

Ora che dici che questo è l'accesso, scommetto che questo proviene da qualcos'altro nella tua configurazione. Puoi provare a eseguire direttamente la query precedente (come scritto ... senza logica di accesso), o è questo che stai provando? –

3

Aggiungi la tua INNER_JOIN prima 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) 

Se LEFT JOIN davanti ai vostri INNER JOIN, quindi non sarà possibile ottenere risultati di table_3 se non esiste una riga corrispondente in turn_updatable. È possibile che questo sia ciò che si desidera, ma poiché le condizioni di join per table_3 si riferiscono solo a runways_updatable, si suppone che si desideri un risultato da table_3, anche se non c'è una riga corrispondente in turn_updatable.

EDIT:

Come @ NikolaMarkovinović sottolineato, si dovrebbe filtrare la LEFT JOIN nella condizione di join in sé, come vedete sopra. In caso contrario, non si otterranno risultati dalla tabella di sinistra (runways_updatable) se tale condizione non viene soddisfatta nella tabella di destra (turn_updatable).


EDIT 2: OP menzionato questo è effettivamente accesso, e non MySQL

In Access, forse è una differenza nelle alias di tabella.Prova questo:

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

Grazie per aver cercato di rispondere a questo, ma la tua risposta non ha funzionato. Sto ottenendo un errore di sintassi affermando: Operatore mancante nell'espressione di query. Quello che ho fatto è stato sostituire table_3 con table_3 e ricevuto quell'errore – Will

+0

@Will: Quale versione di MySQL stai usando? Non vedo errori di sintassi in nessuna delle risposte pubblicate qui. – Travesty3

+0

Sto usando l'accesso – Will

1

Non sono proprio sicuro di quello che vuoi. Ma forse qualcosa di simile:

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

grazie per aver cercato di rispondere alla mia domanda ma sto ricevendo un errore indicante: errore di sintassi nella clausola FROM – Will

+0

Prova a cambiare 'SELECT *' a 'SELECT RUNWAYS_UPDATABLE. *, TURN_UPDATABLE. *' - l'errore può essere causato da nomi di colonna duplicati su table_3 . –

+0

Bel preavviso. Aggiornamento della risposta – Arion

13

Ricordare che il filtraggio di una tabella di destra nell'unione a sinistra deve essere eseguito in join stesso.

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

+1 Ottimo punto. – Travesty3

+0

Per chiarire, potresti anche andare: dove table2.class = 'HIGH' OR table2.class è nullo; –

+2

@robertking No, il numero di righe restituite potrebbe essere diverso perché 'table2.class' potrebbe contenere valori nulli in primo luogo. La condizione di join li filtrerebbe, mentre la condizione li includerebbe. Inoltre, mentre tutte le righe da table1 verranno restituite se viene utilizzata la condizione join, dove condition esclude le righe da table1 che non hanno la riga corrispondente in table2 dove 'class è null o class = 'HIGH''. –

3

Ho finalmente capito. Grazie per tutto il vostro aiuto!!!

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