2017-05-31 4 views
-1

Ich habe eine Baumstruktur in einzelne Tabelle und Element Beziehungen in einer anderen Tabelle. Ich muss alle Eltern von den gegebenen Einzelteilen herausfinden.Suchen Sie alle übergeordneten IDs in Baum in SQL Server

SELECT Id FROM dbo.Items WHERE Selected = 1 

Da ich 6,9 bekommen, 11 aus dieser Abfrage, würde ich brauche übergeordnete Element IDs von denen zurückkehren, die 7, 5, 2.

enter image description here

Ich glaube, ich sollte Verwenden Sie eine Art rekursive CTE dafür, aber ich bin mir nicht sicher, wo ich anfangen soll.

Können Sie mir helfen? Vielen Dank!

dbo.Relationship 
Id  ParentId 
3   6 
6   7 
8   7 
7   2 
4   9 
9   5 
5   2 


dbo.Items 
Id    Selected 
2     0 
3     0 
4     0 
5     0 
6     1 
7     0 
8     0 
9     1 
11     1 

Antwort

0

Möchten Sie alle übergeordnete Elemente ausgewählter Elemente erhalten? Ich habe die temporäre Tabelle geändert.

if object_id('tempdb..#Relationship') is not null drop table #Relationship 
create table #Relationship(Id int,ParentId int) 
insert into #Relationship(Id,ParentId) 
SELECT 3,6 UNION 
SELECT 6,7 UNION 
SELECT 8,7 UNION 
SELECT 7,2 UNION 
SELECT 4,9 UNION 
SELECT 9,5 UNION 
SELECT 5,2 
if object_id('tempdb..#items') is not null drop table #items 
create table #items(Id int, Selected bit) 
insert into #items(Id,Selected) 
SELECT 2,0 UNION 
SELECT 3,0 UNION 
SELECT 4,0 UNION 
SELECT 5,0 UNION 
SELECT 6,1 UNION 
SELECT 7,0 UNION 
SELECT 8,0 UNION 
SELECT 9,1 UNION 
SELECT 11,1 

;with cte AS (
    SELECT i.ID AS SelectedID,r.ParentId FROM #Items AS i INNER JOIN #Relationship AS r ON i.id=r.id WHERE i.Selected=1 
    UNION ALL 
    SELECT cte.SelectedID, r.ParentId FROM #Relationship AS r INNER JOIN CTE ON CTE.ParentId=r.id 
) 
SELECT * FROM cte ORDER BY cte.SelectedID 

Kann es Ihnen helfen?

 
SelectedID ParentId 
----------- ----------- 
6   7 
6   2 
9   5 
9   2 
+0

Das ist genau das, was ich zurückkehren will, aber können Sie mir sagen, wie ich die ganzen ersetzen kann „SELECT {Nummer}, {Nummer} UNION“ Aussagen mit einfachen SELECT Id, ausgewählt aus Artikel. Vielleicht ist das eine dumme Frage. – Pegaz

+0

@Pegaz Sie können die Beziehung und die Items mit Anweisung ignorieren. Sie gleicht nur einer temporären Tabelle, Sie ersetzen sie einfach durch Ihren Tabellennamen in der CTE-Unteranweisung. –

+0

Ah Ok, danke! :) – Pegaz

1

Links Join auf die zugehörige Id zwischen Items und Relations.

SELECT 
    Items.Id, 
    Relationship.ParentId 
FROM Items 
LEFT JOIN Relationship ON Relationship.Id = Items.Id 

Ich habe dies in der Vergangenheit verwendet, um alle Eltern Ids zu erhalten:

with compParent as 
(
    select * from Component Where ComponentId = @ComponentId 
    union all 
    select Component.* from Component join compParent on Component.ComponentId = 
    compParent.ContainerParentId 
) 

select * from compParent; 

Ich habe dies alle Kinder zu bekommen verwendet:

with compChild as 
(
    select * from Component where ComponentId = @ParentId 
    union all 
    select Component.* from Component join compChild on Component.ContainerParentId = compChild.ComponentId 
) 


select * from compChild; 

Sie auch auf viele sehen können stackOverFlow-Posts, die bereits vorhanden sind, um Eltern und/oder Kinder zu erhalten. Oder eine einfache Google-Suche nach "SQL Server Get Parents"

Verwandte Themen