2017-07-05 52 views
3

我有項目和考試表 -CROSS JOIN基於SQL Server中的條件一組

enter image description here

我的願望的結果 -

enter image description here

我嘗試了很多,但我無法根據代碼組加入考試表到項目表。

是否有可能交叉連接或這兩個表的任何其他聯接以獲得期望的結果?

回答

1

你可以試試這個

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 
1

我沒有看到生成缺失數據的方法。日曆表方法是將所有代碼與所有考試交叉加入。然後,左加入這個表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 

演示在這裏:

Rextester

+0

嗯,而不是手動插入第一CTE的代碼,跨在不同的代碼加入將工作(和任何數量的代碼有,萬一不僅僅是三個樣本數據)。例如'SELECT * FROM(SELECT DISTINCT代碼FROM Item)作爲C CROSS JOIN考試' – ZLK

+0

@ZLK我無意中吐出了日曆表,卻沒有意識到它可以被簡化。我接受了你的建議。 –

1

這將產生你所需要的。我正在使用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