我試過在 Google 上搜索并查看 StackOverflow 并發現了類似的問題,但似乎沒有一個對我的具體問題有幫助。
涉及兩個表 -
#func列出負責審查專案的業務功能。
#review捕獲每個功能的專案的評論狀態(In Review = 1,Complete = 2)。
下面是簡化的架構和資料。
CREATE TABLE #func
(
funcId int,
funcName varchar(25)
)
INSERT INTO #func VALUES (1, 'Marketing');
INSERT INTO #func VALUES (2, 'Safety');
INSERT INTO #func VALUES (3, 'Provisioning');
INSERT INTO #func VALUES (4, 'Boss');
CREATE TABLE #review
(
itemId int,
funcId varchar(25),
reviewStatus int
)
INSERT INTO #review VALUES (1, 1, 2);
INSERT INTO #review VALUES (1, 2, 2);
INSERT INTO #review VALUES (1, 3, 2);
INSERT INTO #review VALUES (2, 1, 2);
INSERT INTO #review VALUES (2, 2, 2);
INSERT INTO #review VALUES (2, 3, 2);
INSERT INTO #review VALUES (2, 4, 2);
連接這兩個表會產生“不完整”的結果,“省略”了 itemId = 1 的 Boss 業務功能的一行。
SELECT r.*, f.*
FROM #func f
LEFT JOIN #review r ON f.funcId = r.funcId
ORDER BY r.itemId, r.funcId
| 專案編號 | 功能編號 | 審核狀態 | 功能編號 | 函式名 |
|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 營銷 |
| 1 | 2 | 2 | 2 | 安全 |
| 1 | 3 | 2 | 3 | 供應 |
| 2 | 1 | 2 | 1 | 營銷 |
| 2 | 2 | 2 | 2 | 安全 |
| 2 | 3 | 2 | 3 | 供應 |
| 2 | 4 | 2 | 4 | 老板 |
我明白為什么會發生這種情況,但如何讓它回傳如下所示的結果?
| 專案編號 | 功能編號 | 審核狀態 | 功能編號 | 函式名 |
|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 營銷 |
| 1 | 2 | 2 | 2 | 安全 |
| 1 | 3 | 2 | 3 | 供應 |
| 1 | 4 | 0 | 4 | 老板 |
| 2 | 1 | 2 | 1 | 營銷 |
| 2 | 2 | 2 | 2 | 安全 |
| 2 | 3 | 2 | 3 | 供應 |
| 2 | 4 | 2 | 4 | 老板 |
uj5u.com熱心網友回復:
在這種情況下,您需要CROSS JOIN在加入實際結果之前構建所有可能組合 ( )的資料集。例如
SELECT i.itemId, f.funcName, COALESCE(r.reviewStatus,0) reviewStatus, f.funcName
FROM #func f
CROSS JOIN (
SELECT itemId
FROM #review
GROUP BY itemId
) i
LEFT JOIN #review r ON f.funcId = r.funcId and r.itemId = i.itemId
ORDER BY i.itemId, f.funcId
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344749.html
標籤:sql sql-server 查询语句
