我需要从数据库中获取所有运行,但需要标记此运行是否存在错误。
3表:
此查询可以进一步优化吗?
SELECT TOP 1000 runid,
start,
end,
userid,
CASE
WHEN EXISTS(SELECT rf.fk_fileid
FROM runfiles rf
WHERE rf.fk_runid = r.runid
AND EXISTS(SELECT m.messageid
FROM messages m
WHERE m.fk_fileid =
rf.fk_fileid
AND m.fk_statusid = 4))
THEN 1
ELSE 0
END AS ContainsError
FROM runs r
ORDER BY start DESC
请不要对表名进行评论,他们是为这个问题翻译的。
谢谢!
答案 0 :(得分:0)
试试这个:
SELECT TOP 1000
r.runid
,r.start
,r.[end]
,r.userid
,CASE WHEN m.messageid IS NOT NULL THEN 1 ELSE 0 END AS ContainsError
FROM runs r
LEFT JOIN runfiles rf
ON rf.fk_runid = r.runid
LEFT JOIN [messages] m
ON m.fk_fileid = rf.fk_fileid
AND m.fk_statusid = 4
ORDER BY r.start DESC
对结果集中的每一行运行选择列表中的任何内容。这意味着正在为CASE
行中的每一行执行TOP 1000
语句中的嵌套子查询。
使用左连接和CASE
语句检查主键是否为空,允许将整个语句作为一个集合进行评估,构建SQL Server即可。它应该以这种方式表现得更好。