2017-09-11 3 views
0

Ich suche Datensatz für Spalte, wenn es mit jeder Spalte übereinstimmt, muss es den gesamten Spalteneintrag in der Zeile anzeigen.Wie wird der Spalteneintrag angezeigt, wenn er mit einem anderen Tabelleneintrag mit SQL Server übereinstimmt?

Diese Frage ist ähnlich wie meine vorherige Frage. aber es gibt einige Änderungen, dass ich nicht das Ergebnis bekommen

Hier ist mein Tisch

RelationData

Parent child1 child2 child3 
------------------------------------ 
111  112  113  117 
111  222  223  224 
444  441  442  443 
333  331  332  334 
888  887  889  885 

#tempRecord

ItemID 
----- 
112 
443 
888 

Ich will gesamte bekommen Zeile der Eltern, wenn die #tempRecord.ItemID mit jeder der Spalte in 0 übereinstimmt

Erwartet Ausgabe

ItemID 
------ 
111 
112 
113 
117 
222 
223 
224 
     //111 is the parent of two row. so it will show 2 rows records 
444 
441 
442 
443 
888 
887 
889 
885 

Ich habe versucht, diese folgende Abfrage mit Hilfe von Mr.GordonLinoff

SELECT 
    v.child ItemID 
FROM 
    RelationData rd outer apply 
     (values (rd.ID),(rd.ChildID1), (rd.ChildID2), (rd.childID3)) v(child) 
INNER JOIN ItemTable Item on item.id = v.child 
LEFT JOIN #tempData tt on item.id = tt.Itemid 
WHERE 
    (SELECT Itemid FROM #tempData) IN (rd.ID, rd.ChildID1, rd.ChildID2, rd.childID3) 
    and v.child is not null 
GROUP BY v.child 
+0

Ihre Abfrage hat etwas namens "itemTable", aber es ist nicht Teil Ihrer Frage. Es scheint überflüssig aufgrund der Ergebnisse. –

+0

@GordonLinoff sorry ich werde entfernen. Ich versuche auch etwas anderes –

Antwort

1

Ich glaube, Sie wollen diese Version:

SELECT v.child as ItemID 
FROM RelationData rd OUTER APPLY 
     (VALUES (rd.ID), (rd.ChildID1), (rd.ChildID2), (rd.childID3) 
     ) v(child) JOIN 
     #tempData tt 
     ON tt.Itemid IN (rd.ID, rd.ChildID1, rd.ChildID2, rd.childID3) 
WHERE v.child IS NOT NULL; 

Wenn Du willst keine Duplikate verwenden SELECT DISTINCT.

+0

Es zeigt Fehler in 'ON item.id' ... –

+0

Sie können die Tabelle verlassen. Nehmen Sie nur RelationData und # tempData-Tabelle –

0

Hm ... wenn es immer nur drei Kinder ist, kann es ziemlich geradlinig gelöst werden:

DECLARE @tRelation TABLE(
    parent int 
,child1 int 
,child2 int 
,child3 int 
) 

INSERT INTO @tRelation VALUES 
(111  ,112  ,113  ,117) 
,(111  ,222  ,223  ,224) 
,(444  ,441  ,442  ,443) 
,(333  ,331  ,332  ,334) 
,(888  ,887  ,889  ,885) 

;WITH cte AS(
    SELECT parent, parent AS child 
    FROM @tRelation 
    UNION 
    SELECT parent, child1 AS child 
    FROM @tRelation 
    UNION 
    SELECT parent, child2 AS child 
    FROM @tRelation 
    UNION 
    SELECT parent, child3 AS child 
    FROM @tRelation 
) 
SELECT child 
    FROM cte 
    WHERE parent = 111 

könnte Ein anderer Ansatz UNPIVOT verwenden, aber hier werden Sie (über Union oder was auch immer) hinzufügen müssen der Elternteil, um auch outoutted zu werden:

SELECT parent, child 
    FROM 
    (SELECT parent, child1, child2, child3 
    FROM @tRelation) c 
    UNPIVOT 
    (child FOR childno in (child1, child2, child3) 
) AS chlds 
0

Ich versuchte, auf der Lösung durch Tyron78 ​​zu entmutigen. Grundsätzlich habe ich beide Versionen fertiggestellt - und die Unpivot-Version schneidet besser ab. Schön!

Setup-Testdaten:

DECLARE @tRelation TABLE(
    parent int 
,child1 int 
,child2 int 
,child3 int 
) 
declare @tempRecord table(ItemId int) 

INSERT INTO @tRelation VALUES 
(111  ,112  ,113  ,117) 
,(111  ,222  ,223  ,224) 
,(444  ,441  ,442  ,443) 
,(333  ,331  ,332  ,334) 
,(888  ,887  ,889  ,885) 

insert into @tempRecord(ItemId) 
values(112), (443), (888) 

Erste Lösung mit Union und CTE:

;WITH cte(parent, child) AS(
    SELECT parent, parent AS child 
    FROM @tRelation 
    union 
    SELECT parent, child1 AS child 
    FROM @tRelation 
    UNION 
    SELECT parent, child2 AS child 
    FROM @tRelation 
    UNION 
    SELECT parent, child3 AS child 
    FROM @tRelation 
) 

SELECT  cteChild.child 
FROM  cte 
      inner join 
      @tempRecord tempRecord 
      on tempRecord.ItemId = cte.child 
      inner join 
      cte cteChild 
      on cteChild.parent = cte.parent 

Zweite Lösung mit Entpivotisierung:

SELECT  child 
FROM  (
       SELECT  tRelation.parent, 
          tRelationSameParent.child1, 
          tRelationSameParent.child2, 
          tRelationSameParent.child3 
       FROM  @tRelation tRelation 
          inner join 
          @tempRecord tempRecord 
          on tempRecord.ItemId in (
            tRelation.parent, 
            tRelation.child1, 
            tRelation.child2, 
            tRelation.child3) 
          inner join 
          @tRelation tRelationSameParent 
          on tRelationSameParent.parent = tRelation.parent 
      ) c 
      UNPIVOT 
      (child FOR childno in (parent, child1, child2, child3)) AS chlds 

Teh zweite Vorformen besser und schöner ist.

Verwandte Themen