2017-09-11 1 views
0

Je recherche un enregistrement par colonne, s'il correspond à n'importe qui de la colonne, il doit afficher l'ensemble de l'enregistrement de colonne dans la ligne.Comment afficher l'enregistrement de colonne s'il correspond à un autre enregistrement de table utilisant SQL Server?

Cette question est similaire à ma précédente question. mais il y a des changements, que je ne peux pas obtenir le résultat

Voici ma table

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 

Je veut obtenir toute ligne de parent, si #tempRecord.ItemID est associé à une colonne de RelationData

sortie Attendons

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 

J'ai essayé cette requête suivante à l'aide de 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

Votre requête a quelque chose appelé 'itemTable' mais cela ne fait pas partie de votre question. Cela semble superflu sur la base des résultats. –

+0

@GordonLinoff désolé je vais supprimer. J'essaye aussi bien –

Répondre

1

Je pense que vous voulez cette 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; 

Si vous ne voulez pas de doublons, utilisez SELECT DISTINCT.

+0

Il montre une erreur dans 'ON item.id' ... –

+0

vous pouvez laisser la table d'article. Prendre uniquement la table RelationData et #tempData –

0

Hm ... si elle est toujours seulement trois Childs, il peut être résolu avant tout droit:

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 

Une autre approche pourrait être utilise UNPIVOT, mais ici vous devrez ajouter (via Union ou autre) le parent afin d'être outoutted ainsi:

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

J'ai essayé de ne pas pivoter basé sur la solution par Tyron78. Fondamentalement, j'ai terminé ses deux versions - et la version unpivot fonctionne mieux. Joli!

données de test d'installation:

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) 

Première solution avec l'union et 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 

Deuxième solution avec UNPIVOT:

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 deuxième préformes mieux et est plus agréable.