假设您的意思是您想要Query 2结果中不在Query 1结果中的所有记录,那么一种快速简便的方法是使用EXCEPT
:
[Query 2]
EXCEPT
[QUERY 1]
具体来说:
SELECT DISTINCT GENG.GlGroup
FROM RPZCGenGroup GENG
EXCEPT
SELECT GENG.GlGroup
FROM MCMGenHistory GENH
RIGHT OUTER JOIN RPZCGenGroup GENG
ON GENG.ExpenseCode = substring(GENH.GlCode,13,3)
WHERE SUBSTRING(GENH.GlCode,1,1)='P'
您可能也不想DISTINCT
在第二个查询中使用,因为它可能会降低性能并且对结果没有影响。
更多文档:EXCEPT 和 INTERSECT @ MSDN
看起来您真正想要的是 RPZCGenGroup 中的所有记录,这些记录在MCMGenHistory中没有任何匹配的记录,且 GlCode以“P”开头。快速简便的版本是使用NOT EXISTS
:
SELECT GENG.GlGroup
FROM RPZCGenGroup GENG
WHERE NOT EXISTS (
SELECT
FROM MCMGenHistory GENH
WHERE substring(GENH.GlCode,13,3) = GENG.ExpenseCode
AND SUBSTRING(GENH.GlCode,1,1)='P'
)
的性能NOT EXISTS
可能是一个问题,因此您可以/应该用适当的外部连接替换它(也请注意@Love2Learn 的评估):
SELECT GENG.GlGroup
FROM RPZCGenGroup GENG
LEFT OUTER JOIN MCMGenHistory GENH
ON substring(GENH.GlCode,13,3) = GENG.ExpenseCode
AND SUBSTRING(GENH.GlCode,1,1)='P'
WHERE GENH.GlCode IS NULL