2016-07-31 10 views
0

überschreiten Ich habe SQL Server-Tabellen wie folgt und müssen führen, um Ergebnisse wie folgt zu produzieren.SQL Server: Wie Join-Tabelle

CustOrder:

itemcode orderqty 
------------------- 
item001  10 
item003  30 
item004  50 

hergestellt:

itemcode manuqty 
-------------------- 
item001  100 
item002  200 
item004  300 

Wie ich diese beiden Tabellen beitreten können

itemcode orderqty manuqty 
--------------------------------- 
item001  10   100 
item002  NULL  200 
item003  30   NULL 
item004  50   300 

Jede mögliche Hilfe schätzen zu produzieren.

Antwort

1

Zuerst wird der Ausdruck "Cross-Join" in der DB-Community verwendet, um auf einen Join zu verweisen, der ein so genanntes "kartesisches Produkt" erzeugt. Für zB würde das Alphabet Quer verbunden mit sich selbst produzieren AA, AB, AC, AD ... AZ, BA, BB, BC, usw.

Was Sie wollen, ist nur eine ganz normale beitreten:

Select coalesce(co.itemcode, m.itemcode) itemCode, 
    co.orderqty, m.manuqty 
From custorder co 
    full join manufactured m 
     on m.itemcode = co.itemcode 
+0

regelmäßig enthalten, werden nicht beitreten 'item002' von' manufactured' – JamieD77

+0

@Charless Bretana getestet i Der Code gibt nur item001 10 100 und item004 50 300, die anderen beiden Elemente fehlen – Jackie

+0

dann möchten Sie äußere Verbindung, in diesem Fall eine 'ful l '[außen] 'beitreten'. Ich habe meine Antwort bearbeitet, um sie zu reparieren. –

4

können Sie die vollständige äußere Verbindung dafür verwenden.

SELECT ISNULL(co.itemcode, ma.itemcode) itemcode , 
     orderqty , 
     manuqty 
FROM custorder co 
     FULL OUTER JOIN manufactured ma ON co.itemcode = ma.itemcode 

eine weitere Option, die Sie haben, ist eine Abfrage zu verwenden, um Ihre itemcode Liste aus beiden Tabellen zu bauen und ihm beitreten Ihr Ergebnis zu bekommen .. dies in einer sehr langsamen Abfrage führen kann, wenn Sie viele Datensätze haben. . Im Idealfall würden Sie eine Tabelle ähnlich inventory (itemid int, itemcode varchar) haben und Sie diese Tabelle zu Outer-Join zu den anderen verwenden würde ..

;WITH items AS (
    --get distinct itemcodes from both tables 
    SELECT itemcode FROM custorder 
    UNION 
    SELECT itemcode FROM manufactured 
) 
SELECT i.itemcode, 
     co.orderqty, 
     ma.manuqty 
FROM custorder co 
     RIGHT OUTER JOIN items i ON i.itemcode = co.itemcode 
     LEFT OUTER JOIN manufactured ma ON i.itemcode = ma.itemcode