排除与子查询匹配的记录

时间:2010-06-01 01:02:38

标签: sql sql-server-2005 tsql

这个问题可能有一个明显的答案,但我有一点时间可以随时随地使用它。

考虑查询:

SELECT *
FROM reports AS r
JOIN reportvalues AS rv ON rv.report_id = r.report_id
JOIN metrics AS m ON m.metric_id = rv.metric_id
WHERE r.report_id NOT IN(
    SELECT DISTINCT report_id
    FROM exclude_report
)

在此查询中,exclude_report是以类似方式构建的视图。

现在发生的事情是查询花了很长时间才能执行,可能是因为子查询正在父查询中的每一行上执行。但是,我发现任何其他方式都没有可行的方法。

哦,伟大的SQL向导,请指教。我真的需要一种在SQL中执行此操作的方法,我将在SSRS中使用它。

4 个答案:

答案 0 :(得分:4)

distinct可能会杀死你,在

中使用时,你不需要在子查询中有区别

这样更好吗?

SELECT *
FROM reports AS r
JOIN reportvalues AS rv ON rv.report_id = r.report_id
JOIN metrics AS m ON m.metric_id = rv.metric_id
WHERE NOT EXISTS (SELECT 1 
        FROM exclude_report e 
        WHERE e.report_id = r.report_id)

答案 1 :(得分:0)

SELECT *
FROM reports AS r
JOIN reportvalues AS rv ON rv.report_id = r.report_id
JOIN metrics AS m ON m.metric_id = rv.metric_id
LEFT JOIN exclude_report er ON r.report_id = er.report_id
WHERE er.report_id IS NULL

答案 2 :(得分:0)

您不需要distinct关键字,这可能很重。我还建议你在大表的外键上添加索引。

答案 3 :(得分:0)

我认为你有以下指数:

    表格report_id 上的
  • 字段report 表格report_id
  • 上的
  • 字段reportvalues 表格metric_id
  • 上的
  • 字段reportvalues 表格metric_id
  • 上的
  • 字段metrics 表格report_id
  • 上的
  • 字段exclude_report