2017-07-05 131 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