Query 1の結果には含まれていないQuery 2の結果のすべてのレコードが必要であると仮定すると、すばやく簡単な方法は次のように使用することです。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
おそらくパフォーマンスが低下し、結果に影響を与えないため、2 番目のクエリでも使用したくないでしょう。
詳細なドキュメント: EXCEPT および INTERSECT @ MSDN
あなたが本当に求めているのは、「P」で始まるGlCodeを持つ MCMGenHistoryに一致するレコードがないRPZCGenGroupのすべてのレコードであるように見えます。これの迅速かつ簡単なバージョンは、次を使用することです。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