2014-07-16 9 views
6

Ich verwende MS SQL.
Ich habe die folgenden Tabellen:Vollständige SQL-Verknüpfung ohne Bedingungen

table A: 
    id1 data1 
    8234 ko 
    2  po 
    333  koo 
    40  woo 

table B: 
    id2  data2 
    123  meow 
    654  frrr 

table C: 
    id3  data3 
    10   a 
    20   b 
    30   c 
    40   d 
    50   e 
    60   f 

Ich möchte dies erhalten:

id1  data1  id2  data2  id3  data3 
    8234 ko   123  meow  10   a 
    2  po   654  frrr  20   b 
    333  koo   NULL  NULL  30   c 
    40  woo   NULL  NULL  40   d 
    NULL NULL  NULL  NULL  50   e 
    NULL NULL  NULL  NULL  60   f 

Es ist scheint wie volle Summe von Tabellen ohne Bedingungen. Ich möchte nur alle Spalten und alle Daten aus allen Tabellen erhalten, wie es ist.
Wie kann ich das tun? UPD: Tabellen sind nicht verwandt.
Wenn Tabellen verwandt sind: Ich würde LINKS oder RECHTS JOIN verwenden, wenn im Voraus bekannt war, welche Tabelle größer als ist. Aber es ist unbekannt.

+0

Sind diese überhaupt im Zusammenhang Tabellen? –

+0

@ shree.pat18, Nein. – Alendorff

+1

@Ploutox, FULL JOIN benötigt eine Bedingung für Join, oder? – Alendorff

Antwort

6

einen Index erstellen row_number mit verwenden für Ihre

voll beitreten
select * from (
    select 
     row_number() over (order by id1 asc) rn, 
     id1, data1 
    from ta 
) t1  
full join (
    select 
     row_number() over (order by id2 asc) rn, 
     id2, data2 
    from tb 
) t2 on t1.rn = t2.rn 
full join (
    select 
     row_number() over (order by id3 asc) rn, 
     id3, data3 
    from tc 
) t3 on t1.rn = t3.rn 
+0

ID1 wie '1,2,3' war nur zum Beispiel. Ich habe den Beitrag jetzt bearbeitet. Leider funktioniert Ihre Lösung nicht mit Beispiel, weil erste Tabelle weniger als dritte und ich 2 Strings von der dritten Tabelle verloren. :( – Alendorff

+0

aber volle Join funktioniert gut dort :) – Alendorff

+0

und letzte Bedingung sollte t3.rn = t1.rn OR t3.rn = t2.rn – Alendorff

0

Ich denke, es ist unmöglich, Tabellen zu verbinden, ohne irgendwelche Bedingungen zu erfüllen. Andernfalls müssen Sie den Schlüssel aus Tabelle B mit einem Schlüssel aus Tabelle A belegen. Es spielt keine Rolle, wenn Sie den Schlüssel der Tabelle B (übereinstimmend mit Schlüssel der Tabelle A) nicht einfügen möchten. Sie können immer noch mit der SQL-Abfrage teilnehmen.

Es wird wie:

SELECT tableA.*, tableB.* FROMtableA JOIN tableB ON tableA.id1 = tableB.id1 

sehen Sie das Feld basierend auswählen können auf Sie wollen.

+1

Außer es gibt keine universelle 'ID' zum Ziehen. Sie können Dinge wie "CROSS JOIN" tun, die keine Bedingungen benötigen, aber stattdessen werden alle Zeilen mehrfach zusammengefügt (anstatt dass jede Zeile nur einmal angezeigt wird). –

3

Try this:

with a as 
(select *, row_number() over (order by id1) an from tableA), 
b as 
(select *, row_number() over (order by id2) bn from tableB), 
c as 
(select *, row_number() over (order by id3) cn from tableC) 

select a.id1, a.data1, b.id2, b.data2, c.id3, c.data3 
from a 
full outer join b on a.an = b.bn 
full outer join c on a.an = c.cn 

SQL Fiddle

+0

Wir wissen nicht, welche Tabelle hat die wenigsten Zeilen, so 'LEFT'/'RIGHT' Join ist out. –

+0

@ Clockwork-Muse Yep, geändert zu voll beizutreten –

Verwandte Themen