Domanda

La settimana scorsa sono stato sorpreso di scoprire che Sybase 12 non supporta full outer join. Ma mi venne in mente che un full outer join dovrebbe essere lo stesso di un join esterno sinistro unioned con un join esterno destro dello stesso sql. Qualcuno può pensare a una ragione questo non terrebbe vero?

È stato utile?

Soluzione

UNION-ing due dichiarazioni OUTER JOIN dovrebbe portare a righe duplicate che rappresentano i dati che si otterrebbe da un INNER JOIN. Dovreste fare probabilmente un SELECT DISTINCT sul set di dati prodotta dal UNION. In genere se si deve utilizzare un SELECT DISTINCT che significa che non è una query ben progettato (o almeno così ho sentito).

Altri suggerimenti

Se l'unione loro con UNION ALL, si otterrà i duplicati. Se si basta usare UNION senza il ALL, si filtrare i duplicati e quindi essere equivalente a un pieno unirsi, ma la query sarà anche molto più costoso perché deve svolgere una specie distinta.

UNION ALL sinistra unirsi alla destra si uniscono, ma limitare il diritto iscriverti per solo le righe che non esistono nella tabella di base (restituire null sul join quando non sarebbero nulla nella tabella se esistessero).

Per questo codice che sarà necessario creare due tabelle t1 e t2. t1 dovrebbe avere una colonna denominata c1 con cinque righe contenenti i valori 1-5. t2 dovrebbe avere anche una colonna c1 con cinque file contenente i valori 2-6.

full outer join:

select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;

full outer join equivalente:

select t1.c1, t2.c1 from t1 left join  t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1 
where t1.c1 is null
order by 1, 2;

Si noti la clausola WHERE sulla destra unito di selezione che limita i risultati solo a coloro che non sarebbe duplicati.

  1. Ben prima, non so il motivo per cui si sta utilizzando 12.x. E 'stato EndOfLifed il 31 dicembre 2009, dopo aver notificato il 3 Aprile 2007. 15.0. 2 (prima versione solido) è uscito nel gennaio 2009. 15.5 è molto meglio ed era disponibile 2 dicembre 2009, in modo da sono due versioni principali, e per almeno 13 mesi, non aggiornati.

  2. ASE 12.5.4 ha la nuova sintassi Join. (Non è stato specificato, si può essere sulla 12.5.0.3, il rilascio prima di tale).

  3. DB2 e Sybase non implementano FULL OUTER JOIN, proprio per la ragione che avete identificato: è coperto da LEFT ... UNION ... RIGHT senza ALL. Non è un caso di "non sostenere" un UFG; si tratta di un caso della parola chiave non è presente.

  4. E poi c'è il problema che i tipi Sybase e DB2 sarebbero generalmente non usare mai outer join lasciare FOJs da solo, perché le loro banche dati tendono ad essere più normalizzato, ecc.

  5. Ultimo, c'è SQL perfettamente normale è possibile utilizzare in qualsiasi versione di Sybase che fornirà la funzione di UFG, e sarà nettamente più veloce su 12.x; solo marginalmente più veloce su 15.x. E 'un po' come la funzione di RANK ():. Tutto inutile se si può scrivere una sottoquery

  6. Il secondo motivo non necessita FULL OUTER, alcuni dei motori di fascia bassa lo fanno, è perché il nuovo ottimizzatore è estremamente veloce, e la query è completamente normalizzata. Vale a dire. esegue la sinistra e la destra in un unico passaggio.

  7. A seconda voi SARGs e disallineamenti DataType, ecc può ancora avere per ordinare-merge, ma anche che è in streaming a tutti e tre i livelli: sottosistema disco I / O; motore (s); e gestore di rete. Se le tabelle sono partizionati, allora è inoltre parallelised a quel livello.

  8. Se il server non è configurato e il vostro set di risultati è molto grande, potrebbe essere necessario aumentare proc cache size e number of sort buffers. Questo è tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top