pen*_*ake 1 t-sql filtering sql-server-2008
我试图在MS-SQL数据库中发现一些损坏的记录.
在一个简化的例子中,scenerio是这样的:
我有两张桌子,简单地说:
表1:Id,日期,OpId
表_2:Date,OpId,EventName
我有这个业务规则:如果Table_1中有记录,那么Table_1中的Table_1.Date和Table.OpId中应该至少存在1行.
如果Table_1中有一行,并且如果表中没有与该行匹配的行,那么就会出现数据损坏 - 无论是什么原因 - .
为了找出不正确的数据,我使用:
SELECT *
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.Date = t2.Date AND t1.OpId = t2.OpId
WHERE t2.OpId IS NULL -- So, if there is no
-- matching row in table_2 then this is a mistake
Run Code Online (Sandbox Code Playgroud)
但是查询完成需要很长时间.
有没有更快或更好的方法来接近类似的场景?
要做到防半连接NOT EXISTS
的SQL Server是在性能上比通常好于或等于其他选项(NOT IN
,OUTER JOIN ... NULL
,EXCEPT
)
SELECT *
FROM table_1 t1
WHERE NOT EXISTS (SELECT *
FROM table_2 t2
WHERE t1.Date = t2.Date
AND t1.OpId = t2.OpId)
Run Code Online (Sandbox Code Playgroud)
请参阅左外连接与NOT EXISTS.你可能会错过一个有用的索引.