【发布时间】:2023-03-23 06:50:01
【问题描述】:
我的目标是编写一个查询,该查询将返回具有 3 个标志字段的所有类别,如下所示:
ID |恩 |茹 |神父
语言标志必须根据是否有任何与该类别关联的课程记录打开或关闭。
我现在的陈述是这样的:
SELECT c.ID,
(CASE WHEN c.ID IN (SELECT c.ID FROM Lessons AS l WHERE l.Category_Id = c.ID AND l.Language_Id = 1) THEN 1 ELSE 0 END) AS En,
(CASE WHEN c.ID IN (SELECT c.ID FROM Lessons AS l WHERE l.Category_Id = c.ID AND l.Language_Id = 2) THEN 1 ELSE 0 END) AS Ru,
(CASE WHEN c.ID IN (SELECT c.ID FROM Lessons AS l WHERE l.Category_Id = c.ID AND l.Language_Id = 3) THEN 1 ELSE 0 END) AS Fr
FROM LessonCategories AS c
问题是这个查询非常慢,因为 Lessons 表有超过 60,000 条记录,而且我运行了 3 次。
我正在寻找一种方法来提高此查询的效率。 我曾想过在类别和课程之间使用分组连接,但我不知道具体如何以及是否可能。
更快速查询的伪代码是:
SELECT c.[ID],
COUNT(l.Language_Id = 1) > 0 AS En
COUNT(l.Language_Id = 2) > 0 AS Ru
COUNT(l.Language_Id = 3) > 0 AS Fr
FROM CategoryTreeView AS c
INNER JOIN Lessons AS l ON l.Category_Id = c.ID
GROUP BY c.[ID]
可以使用有效的 t-sql 来表达吗? 或者有什么更好的方法来处理这种查询?
附:如果它有帮助,我不在乎得到一个按位标志字段而不是 3 个语言字段。
谢谢。
【问题讨论】: