0

欠落しているテーブル間で共通の値を見つける方法を知っていますが、2 つのクエリはありますか?

クエリ 1:

SELECT DISTINCT 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'

結果:

10
7
8
5
1
6
9
4

クエリ 2:

SELECT DISTINCT GENG.GlGroup 
from RPZCGenGroup GENG

結果:

1
10
2
3
4
5
6
7
8
9

2 と 3 など、欠落しているレコードが必要です。問題は、最初のクエリが同じテーブルを使用しているが、フィルターを使用していることです。

4

2 に答える 2

5

基準の外に基準を追加すると、効果的に に変わりJOINます。私が正しく理解している場合、結合基準が適用されない GENG.GlGroup 値が必要なので、すべてのカリング基準をロジック内に保持し、GENH.GlGroup が Null である RPZCGenGroup からレコードを取得してみませんか?OUTER JOININNER JOINOUTER JOIN

SELECT  DISTINCT GENG.GlGroup
FROM    MCMGenHistory GENH 
RIGHT   OUTER JOIN RPZCGenGroup GENG 
        ON  GENG.ExpenseCode=substring(GENH.GlCode,13,3)
        AND SUBSTRING(GENH.GlCode,1,1)='P'
WHERE   GENH.GlCode Is Null 
于 2013-04-08T14:37:44.783 に答える
2

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
于 2013-04-08T14:23:58.737 に答える