2017-12-20 2 views
0

Gibt es eine Möglichkeit, zwei hierarchische Tabellen in SQL Server beizutreten/zusammenführen?SQL Join/Merge zwei hierarchyid Tabellen

Ich habe zwei Beispieltabellen: BOM und ComponentDetail

declare @BOM table 
    (
     BomNode hierarchyid primary key, 
     ComponentID int 
    ) 

insert into @BOM 
values 
    ('/',    NULL), 
    ('/1/',   1), 
    ('/1/1/',   2), 
    ('/1/2/',   3), 
    ('/1/3/',   4) 

declare @ComponentDetail table 
    (
     CompNode hierarchyid primary key, 
     ComponentID int, 
     SteelProductID int 
    ) 

insert into @ComponentDetail 
values 
    ('/',   NULL,NULL), 
    ('/1/',  2, NULL), 
    ('/1/1/',  2,1), 
    ('/1/2/',  2,2) 

Was ich tun möchte, ist vorübergehend die beiden Tabellen zu kombinieren, nur das Ergebnis in meiner Anwendung zu lesen:

UPDATE: @Sean Lange ich habe einen Fehler in erklärt Ergebnistabelle gemacht - es wie unten aussehen:

insert into @Result 
    values 
     ('/',  NULL, NULL), 
     ('/1/', 1, NULL), 
     ('/1/1/', 2, NULL), 
     ('/1/1/1/', NULL, 1), 
     ('/1/1/2/', NULL, 2), 
     ('/1/2/', 3, NULL), 
     ('/1/3/', 4, NULL) 

select 
    Node.ToString() as NodeChar, ComponentID, SteelProductID 
from @Result 

Hier ist ein Diagramm von desi rote Ausgabe: Output diagram

Jeder?

+0

Es ist viel einfacher, wenn Sie nicht einzelne Datensatz-ID-Werte als „Schrägstrich begrenzt“() Werte in einer Spalte zu speichern sind?. Sie können ein rekursives CTE verwenden, um alle Ebenen der Stückliste zusammenzufassen. Es sieht so aus, als müssten Sie zuerst Ihre Daten analysieren und normalisieren und dann eine andere Abfrage verwenden, um die benötigten Daten zurückzugeben. –

+1

@JacobH, die keine Daten mit Trennzeichen sind, verwendet das OP den hierarchyid-Datentyp. https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference –

+0

Ah das ist ordentlich. Niemals einen Hierarchie-ID-Typ verwendet. Lerne jeden Tag etwas Neues. –

Antwort

0

Sie können diese beiden Tabellen wie jede andere Tabelle zusammenfügen. In diesem Fall ist wahrscheinlich ein vollständiger äußerer Join das, was Sie wollen.

Dies gibt die gewünschte Ausgabe Ihrer Beispieldaten:

select Node = coalesce(b.BomNode.ToString(), c.CompNode.ToString()) 
    , ComponentID = coalesce(b.ComponentID, c.ComponentID) 
    , c.SteelProductID 
from @BOM b 
full outer join @ComponentDetail c on c.CompNode = b.BomNode 

--EDIT--

Mit meinem neuen Verständnis halte ich es für so etwas wie diese (aber es ist nicht ganz richtig eingeschaltet ist die Hierarchie Zeug, aber mir nicht klar, was du da wollen):

select distinct Node = coalesce(b.BomNode.ToString(), c.CompNode.ToString()) + coalesce(convert(varchar(4), c.ComponentID) + '/', '') 
    , ComponentID = coalesce(b.ComponentID, c.ComponentID) 
    , c.SteelProductID 
from @BOM b 
full outer join @ComponentDetail c on b.ComponentID = c.ComponentID 
+0

Vielen Dank Sean für die Antwort, leider ist es nicht, wie Ergebnis aussehen sollte. Mit Ihrer Abfrage bekomme ich ambigous Ausgang: https://ibb.co/mUz6Pm und es ist nicht korrekt. – exegee

+0

Wahrscheinlich möchten Sie stattdessen an ComponentID teilnehmen. Aber ich bin ein wenig verwirrt wegen Ihrer gewünschten Ausgabe. Woher kommt '/ 4 /'? Es ist nicht in Ihren Beispieldaten vorhanden. –

+0

/4/stammt aus der Stücklistentabelle (Knotennummer:/1/3 /). Ich möchte sie auf ComponentID und in diesem bestimmten Beispiel auf ComponentID = 2 verbinden. BOM-Tabelle besteht aus Assembly/Teil Abhängigkeit, aber einige Komponenten können aus SteelProducts bestehen und diese Informationen kann ich von ComponentDetail abrufen. Ich entschuldige mich für mein Englisch :) – exegee