我有项目和考试表 -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我无意中吐出了日历表,却没有意识到它可以被简化。我接受了你的建议。 –