0

我需要从数据库中获取所有运行,但需要标记此运行是否有错误。

3 表:

  • 运行:包含运行)
  • Runfiles:包含在运行期间处理的文件 ID
  • 消息:包含错误、警告、...

这个查询可以进一步优化吗?

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 

请不要评论表名,它们是为这个问题翻译的。

谢谢!

4

1 回答 1

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 就是这样做的。它应该以这种方式表现更好。

于 2013-02-20T23:32:13.933 回答