簡體   English   中英

在同一張表上加入外鍵並顯示父子

[英]Join foreign key on the same table and show parent and child

我有一個外鍵,它指向同一個表(子-父)的主鍵。

我正在嘗試編寫一個查詢,該查詢將以如下所示的形式顯示結果:

Parent 1 
Parent 1 > Child 1
Parent 1 > Child 2
Parent 2 
Parent 2 > Child 2 
Parent 3 
Parent 4

我想離開加入表,即使我很接近它,但我一直無法做到。 讓我知道我做錯了什么,或者是否有更簡單的解決方案。

SELECT 
    a.OrganizationTypeID,
    b.ParentOrganizationTypeID,
    a.Name ParentName,
    b.Name ChildName,
    CASE
        WHEN b.ParentOrganizationTypeID IS NULL THEN a.Name
        ELSE CONCAT_WS('>', a.Name, b.Name)
    END AS res
FROM
    tblOrganizationTypes a
        left JOIN
    tblOrganizationTypes b ON b.ParentOrganizationTypeID = a.OrganizationTypeID
WHERE a.DateDeleted is null
GROUP BY b.OrganizationTypeID
ORDER BY a.OrganizationTypeID , b.ParentOrganizationTypeID

在此處輸入圖片說明

在此處輸入圖片說明

請從您的查詢中刪除Group by子句。

SELECT 
    a.OrganizationTypeID,
    b.OrganizationTypeID,
    
    a.Name ParentName,
    b.Name ChildName,
    CASE
        WHEN b.ParentOrganizationTypeID IS NULL THEN a.Name
        ELSE CONCAT_WS('>', a.Name, b.Name)
    END AS res
FROM
    tblOrganizationTypes a
    left join    
    tblOrganizationTypes b on a.OrganizationTypeID=b.ParentOrganizationTypeID 
    or (a.ParentOrganizationTypeID is null and a.OrganizationTypeID=b.OrganizationTypeID)
where a.DateDeleted is null and b.Name is not null
ORDER BY a.ParentOrganizationTypeID , b.OrganizationTypeID

數據庫小提琴:

架構和插入語句:

 create table tblOrganizationTypes (OrganizationTypeID int, ParentOrganizationTypeID int, Name varchar(100),DateDeleted date);
 insert into tblOrganizationTypes values(1,null, 'parent',null);
 insert into tblOrganizationTypes values(2,1, 'child 1',null);
 insert into tblOrganizationTypes values(3,1, 'child 2',null);
 insert into tblOrganizationTypes values(5,null, 'parent 5',null);

詢問:

 SELECT 
     a.OrganizationTypeID,
     b.OrganizationTypeID,
     
     a.Name ParentName,
     b.Name ChildName,
     CASE
         WHEN b.ParentOrganizationTypeID IS NULL THEN a.Name
         ELSE CONCAT_WS('>', a.Name, b.Name)
     END AS res
 FROM
     tblOrganizationTypes a
     left join    
     tblOrganizationTypes b on a.OrganizationTypeID=b.ParentOrganizationTypeID 
     or (a.ParentOrganizationTypeID is null and a.OrganizationTypeID=b.OrganizationTypeID)
 where a.DateDeleted is null and b.Name is not null
 ORDER BY a.ParentOrganizationTypeID , b.OrganizationTypeID

輸出:

組織類型 ID 組織類型 ID 父母名字 孩子姓名 資源
1 1 父母 父母 父母
1 2 父母 孩子 1 父母>孩子 1
1 3 父母 孩子 2 父母>孩子 2
5 5 家長 5 家長 5 家長 5

db<> 在這里擺弄

我建議你分兩種情況:

-- roots
select a.OrganizationTypeID
    , a.ParentOrganizationTypeID
    , a.Name
    , a.Name as childname
    , a.Name as res
from tblOrganizationTypes a
where a.ParentOrganizationTypeID is null
  and a.DateDeleted is null 
union all
-- children of roots
SELECT 
    a.OrganizationTypeID,
    b.OrganizationTypeID,
    a.Name ParentName,
    b.Name ChildName,
    CONCAT_WS('>', a.Name, b.Name) AS res
FROM tblOrganizationTypes a
JOIN tblOrganizationTypes b 
    ON b.ParentOrganizationTypeID = a.OrganizationTypeID 
where a.DateDeleted is null 
ORDER BY OrganizationTypeID, ParentOrganizationTypeID;

如果您想要更深的嵌套,您可以輕松地將其轉換為遞歸 CTE

我修改了你的小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM