我有項目和考試表 -CROSS JOIN基於SQL Server中的條件一組
我的願望的結果 -
我嘗試了很多,但我無法根據代碼組加入考試表到項目表。
是否有可能交叉連接或這兩個表的任何其他聯接以獲得期望的結果?
我有項目和考試表 -CROSS JOIN基於SQL Server中的條件一組
我的願望的結果 -
我嘗試了很多,但我無法根據代碼組加入考試表到項目表。
是否有可能交叉連接或這兩個表的任何其他聯接以獲得期望的結果?
你可以試試這個
SELECT A.Code, i.Item, A.Exam
FROM
(
SELECT Code,e.Exam
FROM Item i
CROSS JOIN Exam e
GROUP BY Code,e.Exam
) A
LEFT JOIN Item i ON i.Code= A.Code AND i.Exam = A.Exam
我沒有看到生成缺失數據的方法。日曆表方法是將所有代碼與所有考試交叉加入。然後,左加入這個表Item
和爲了得到你想要的結果:
WITH cte AS (
SELECT *
FROM (SELECT DISTINCT Code FROM Item) AS C
CROSS JOIN Exam
)
SELECT
t1.Code,
t2.Item,
t1.Exam
FROM cte t1
LEFT JOIN Item t2
ON t1.Code = t2.Code AND
t1.Exam = t2.Exam
ORDER BY
t1.Code,
CASE WHEN t2.Item IS NOT NULL THEN 0 ELSE 1 END,
t1.Exam
演示在這裏:
這將產生你所需要的。我正在使用UNION來結合CROSS JOIN和項目表,然後按組來確保NULL被刪除。
SELECT code, max(item) as item, exam
FROM
(SELECT distinct i.code, null as item, e.exam FROM exam e cross join item i
union all
SELECT code, item, exam
FROM item) u
group by code, exam
order by code, exam
嗯,而不是手動插入第一CTE的代碼,跨在不同的代碼加入將工作(和任何數量的代碼有,萬一不僅僅是三個樣本數據)。例如'SELECT * FROM(SELECT DISTINCT代碼FROM Item)作爲C CROSS JOIN考試' – ZLK
@ZLK我無意中吐出了日曆表,卻沒有意識到它可以被簡化。我接受了你的建議。 –