使用3个表优化SQL查询

时间:2013-02-20 14:34:58

标签: sql-server tsql optimization query-optimization

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

3表:

  • 运行:包含运行)
  • 运行文件:包含在运行期间处理的文件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 

请不要对表名进行评论,他们是为这个问题翻译的。

谢谢!

1 个答案:

答案 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即可。它应该以这种方式表现得更好。