[英]Two foreign keys in parent table reference same child table. How to structure INNER JOIN?
[英]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.