Sql-Server

連接兩個表,每個主鍵包含父表中的一行

  • October 22, 2018

我有一個簡單的主鍵和外鍵連接……我需要在每個主鍵的結果中包含父表中的一行,作為子項的一種標題行。例如,我有兩張桌子,

parents
ID | Name
0  | FOO
1  | BAR
2  | ASD

children
ID | Name | ParentID
10 | baz  | 0
11 | zap  | 0
12 | zam  | 1
13 | maz  | 1

我想做一個返回的視圖

ParentID | ChildID | Name | isChild
0        |         | FOO  | False
0        | 10      | baz  | True
0        | 11      | zap  | True
1        |         | BAR  | False
1        | 12      | zam  | True
1        | 13      | maz  | True
2        |         | ASD  | False

資料結構沒有多大意義,但它填充了 3rd 方軟體,這是唯一的格式選項。現在我正在為每個父母添加一個額外的查詢來訪問數據庫。我想把它放到一個查詢中會更有效率,我只有幾百個父母

謝謝!

也許我錯過了一些東西,但我不明白為什麼這不是一個簡單的UNION.

--Demo setup
Declare @Parent table (ID int, Name varchar(30))
insert into @Parent(id, Name) values(0,'FOO'),(1,'BAR'),(2,'ASD')
Declare @Children table (ID int, Name varchar(30),ParentId int)
insert into @Children(id, Name,ParentId) values(10,'bas',0),(11,'zap',0),(12,'zam',1),(13,'maz',1)

--The solution
;with UnionedData as
(
SELECT ID AS ParentId
   ,' ' AS ChildID
   ,NAME
   ,'False' AS isChild
FROM @Parent

UNION ALL

SELECT p.Id
   ,convert(VARCHAR(5), c.id) AS ChildID
   ,c.NAME
   ,'True' AS IsChild
FROM @Parent p
JOIN @Children c
   ON c.ParentId = p.id
)
SELECT *
FROM UnionedData
ORDER BY ParentId
   ,ChildID

| ParentId | ChildID | NAME | isChild |
|----------|---------|------|---------|
| 0        |         | FOO  | False   |
| 0        | 10      | bas  | True    |
| 0        | 11      | zap  | True    |
| 1        |         | BAR  | False   |
| 1        | 12      | zam  | True    |
| 1        | 13      | maz  | True    |
| 2        |         | ASD  | False   |

引用自:https://dba.stackexchange.com/questions/220743