Wie eine vollständige äußere Verknüpfung zu tun, ohne vollständige äußere mit beitreten verfügbar

StackOverflow https://stackoverflow.com/questions/2089658

  •  21-09-2019
  •  | 
  •  

Frage

Letzte Woche war ich überrascht, dass 12 sybase, um herauszufinden, nicht voll Outer-Joins unterstützen. Aber es fiel mir ein, dass eine vollständige äußere Verknüpfung sollte das gleiche wie eine linke Außen sein join mit einer rechten äußeren unioned kommen von der gleichen SQL. jemand denken Sie an einen Grund kann dies nicht wahr halten?

War es hilfreich?

Lösung

UNION-ing zwei OUTER JOIN Aussagen sollten in doppelten Zeilen führen die Daten, welche Sie von einem INNER JOIN bekommen würden. Sie müssten wahrscheinlich eine SELECT DISTINCT auf den Datensatz tun durch die UNION produziert. Im Allgemeinen, wenn Sie ein SELECT DISTINCT dass Mittel verwenden müssen, es ist nicht ein gut konzipiertes Abfrage (oder so habe ich gehört).

Andere Tipps

Wenn Sie Vereinigung sie mit UNION ALL, werden Sie Duplikate erhalten. Wenn Sie nur UNION ohne ALL verwenden, wird es Duplikate filtern und damit gleichwertig sein, um eine vollständige beitreten, aber die Abfrage wird auch sehr viel teurer sein, weil es eine bestimmte Art zu erfüllen hat.

UNION ALL die linke Verknüpfung mit dem rechten verbinden, sondern begrenzt die Verbindung Recht auf nur Zeilen, die nicht existieren in der Basistabelle (return null auf den beitreten, wenn sie nicht null in der Tabelle sein würden, wenn es sie gibt).

Für diesen Code benötigen Sie zwei Tabellen T1 und T2 zu erstellen. t1 sollten die Werte mit 1-5 eine Spalte namens c1 mit fünf Reihen haben. t2 sollte auch eine c1 Spalte mit fünf Zeilen 2-6 die Werte enthalten.

Full Outer Join:

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

Full Outer Join-äquivalent:

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;

der Hinweis where-Klausel auf der rechten Seite wählen verbunden, die Grenzen, die Ergebnisse nur auf diejenigen, die nicht Duplikate sein würde.

  1. Nun zunächst, ich weiß nicht, warum Sie 12.x. verwenden Es war EndOfLifed am 31. Dezember 2009, nach dem Einschalten 3 2007 15.0 April mitgeteilt wurde. 2 (erste feste Version) kam 2009 15,5 Januar heraus ist viel besser und war verfügbar 2. Dezember 2009, so dass Sie zwei Hauptversionen sind und über mindestens 13 Monate veralten.

  2. ASE 12.5.4 hat die neue Join-Syntax. (Sie nicht angegeben haben, können Sie auf 12.5.0.3 sein, die Freisetzung vor, dass).

  3. DB2 und Sybase nicht FULL OUTER JOIN implementieren, für genau der Grund, Sie identifiziert haben: Es wird von LEFT ... UNION ... RIGHT ohne ALL bedeckt ist. Es ist kein Fall der Verwendung eines BJ „nicht unterstützt“; es ist ein Fall von dem Schlüsselwort fehlt.

  4. Und dann haben Sie das Problem, dass Sybase und DB2-Typen würden in der Regel nie äußerte verwenden schließt sich allein FOJs lassen, weil ihre Datenbanken sind in der Regel normalisiert werden, etc.

  5. Zuletzt gibt es ganz normale SQL Sie in einer beliebigen Version von Sybase verwenden können, die die Funktion von BJ liefern wird, und wird deutlich schneller auf 12.x; nur geringfügig schneller auf 15.x. Es ist ein bisschen wie die RANK () Funktion:. Gar nicht nötig, wenn Sie eine Unterabfrage schreiben

  6. Der zweite Grund ist es nicht FULL OUTER braucht, wie einige der Low-End-Motoren zu tun, ist, weil die neue optimiser extrem schnell, und die Abfrage vollständig normalisiert. D. h. es führt die links und rechts in einem einzigen Durchgang.

  7. Abhängig von Ihnen Sarg und Nicht passende Datentypen, etc. es noch sort-merge haben kann, aber auch das ist auf allen drei Ebene gestreamt: Disk-I / O-Subsystem; Motor (s); und Netzwerk-Handler. Wenn Ihre Tabellen partitioniert sind, dann wird es zusätzlich auf dieser Ebene parallelisiert.

  8. Wenn der Server nicht so konfiguriert ist, und Ihre Ergebnismenge sehr groß ist, müssen Sie möglicherweise proc cache size und number of sort buffers erhöhen. Das ist alles.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top