列出不在视图中的表中的数据

时间:2012-06-07 04:58:30

标签: sql-server sql-server-2008 tsql

Table1有列

Id int, Date smalldatetime.

View1在许多其他列中都有Id int列。

View1的最大值为2000 rows,但是有一些相当复杂的计算来确定所有列的值。

在[{1}}和Table1.Id之间返回View1.Id Table1.Date以内的所有'2012-05-30'的最有效方法是什么?

来自'2012-05-31'的已过滤选择通常会返回约Table1 200 unique

当我执行SELECT * FROM View1时,总数据总是在一秒钟内返回。当我从Table1 WHERE Date BETWEEN'2012-05-30'EN'2012-05-31'执行SELECT Id时,结果总是不稳定的。

我尝试SELECT Table1.Id从Table1 T1 WHERE Date BETWEEN .. AND .. AND NOT EXISTS(从View1 WHERE ViewId = T1.Id中选择Id),它需要年龄(差不多20秒)。

我也试过使用CTE,WITH V1 as(来自View1的SELECT Id)SELECT T1.Id FROM Table1 T1 WHERE Date BETWEEN ... and ... AND NOT EXISTS(SELECT WH from V1 WHERE V1.Id = T1 .Id),也需要很长时间。

感谢。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SELECT t.Id, t.[Date]
FROM dbo.Table1 AS t
LEFT HASH JOIN dbo.View1 AS v ON v.Id = t.Id
WHERE t.[Date] >= '20120530' AND t.[Date] < '20120531'
AND v.Id IS NULL

HASH提示强制SQL Server查询优化器仅评估视图一次。

另一种方法是使用表变量来存储视图的结果:

DECLARE @ViewResult TABLE (Id int PRIMARY KEY)
INSERT INTO @ViewResult 
SELECT Id FROM dbo.View1

SELECT Id, [Date]
FROM dbo.Table1
WHERE [Date] >= '20120530' AND [Date] < '20120531'
AND Id NOT IN (SELECT Id FROM @ViewResult)

勒兹

答案 1 :(得分:0)

除了别的什么,我会说,如果必须引用视图,那么:

SELECT t.Id, t.[Date]
  FROM dbo.Table1 AS t
  WHERE t.[Date] >= '20120530'
  AND t.[Date] < '20120531'
  AND NOT EXISTS 
  (
    SELECT 1 FROM dbo.View1 AS v
    WHERE v.Id = t.Id
  );

但我怀疑如果你可以绕过观点,你可以在这里做更有效的事情。