EXCEPT

2017-02-02 3 views
1

を使用して異なるSQL列を検索すると、選択間のEXCEPTを使用して、異なるレコードが検索されます。 レコードを検索するキーが与えられている場合、どのCOLUMNSがその違いを引き起こしたかを指定するにはどうすればよいですか? テーブルの列で何らかの種類のバイナリ検索を行うと、個々のEXCEPTSを列で減らし、より良い方法を探します。EXCEPT

サンプル:

select 'A','B','C','D','E' 
except 
select 'A','F','C','D','Z' 

結果:B、E

select 'A','F','C','D','Z' 
except 
select 'A','B','C','D','E' 

結果:F、Z

+1

基本的に直積、私はヌルをチェックしませんし、パフォーマンスがひどいです、それは上記の完全な解決策ではないことに注意してくださいDDL + DMLなどのサンプルデータが含まれるようにあなたの質問を編集してください、必要な結果。 –

+0

を使用している場合は、個々の列ではなく行全体が返されます。https://www.simple-talk.com/sql/performance/the-except-and-intersect-operators-in- sql-server/ –

+0

正確には、最初に相違を引き起こした列を見つける方法を探しています。 – dirtyw0lf

答えて

0

私はこれが可能かさえ望ましいであろうことを確認していません。

例では、行と比較していますが、i SQLのセットに基づく操作の1つを除いています。彼らは2つの異なるセットまたはリレーションを扱い、数学の比較セットで見られる比較可能な部分を実行します。

ので

Table A Except Table B 

戻っ表Bに含まれていない表のすべてのメンバー

はあなたの例を拡張します:リターンを除き

select 'A','B','C','D','E' 
except 
(select 'A','F','C','D','Z' 
union 
select 'A','F','X','D','Z' 
) 

最初のセット内のメンバー第1セットの唯一のメンバーとして出てくる第2セットには存在しない。

しかし、出力として何をしたいですか?定義によって、Expectの結果は2番目のセットのメンバーではないため、列ごとの比較が必要な場合は、2番目のセットのすべてのメンバー、この場合は

'B','E' 
'B','C','Z' 

これでもうセット操作をしていません。

もう1つの問題は、テーブルには列があり、それは別個のものです。あなたの提案された出力はこれを考慮しません。

この出力を見たいですか?

select 'A' C1,'B' C2,'C' C3,'D' C4,'E' C5 
except 
select 'A','F','C','D','Z' 
.... 
C1 C2 C3 C4 C5 
NULL 'B' NULL NULL 'E' 

またはこの出力

select 'A' C1,'B' C2,'C' C3,'D' C4,'E' C5 
except 
select 'A','F','C','D','Z' 
.... 
Column1 
'C2,C5' 

またはこの出力

select 'A' C1,'B' C2,'C' C3,'D' C4,'E' C5 
except 
select 'A','F','C','D','Z' 
.... 
Column1 Column2 
'B'  'E' 

またはこの出力

select 'A' C1,'B' C2,'C' C3,'D' C4,'E' C5 
except 
select 'A','F','C','D','Z' 
.... 
Column1 
'B,E' 

ベースの操作を設定するために戻すには、彼らはセットで動作する、または構造が似ている表、彼らは構造が似ているセットを返します。

私の示唆している出力のうちの1つだけがそれを行い、あなたが返すものの問題がまだあります。

あなたは我々はそれがこれは他の人に、各セット内の各ラインの完全な比較である

を実現するためにどのようにとの提案を行うことができ、これらの違いを見つける必要があり、なぜあなたが列を返す、指定することができた場合、その異なる:

select distinct 
    case when a.c1!=b.C1 then a.C1 else null end C1 
    ,case when a.c2!=b.C2 then a.C2 else null end C2 
    ,case when a.c3!=b.C3 then a.C3 else null end C3 
    ,case when a.c4!=b.C4 then a.C4 else null end C4 
    ,case when a.c5!=b.C5 then a.C5 else null end C5 
from (values 
    ('A','B','C','D','E') 
    ,('A','B','C','D','Z') 
    ,('1','2','3','4','5') 
    ) a(C1,C2,C3,C4,C5) 
cross join 
(values 
    ('A','F','C','D','Z') 
    ,('A','F','C','D','Z') 
    ,('A','F','C','D','Z') 
    ,('A','B','C','D','E') 
) b(C1,C2,C3,C4,C5) 
where 
    not (
    a.C1=b.c1 
    AND a.C2=b.c2 
    AND a.C3=b.c3 
    AND a.C4=b.c4 
    AND a.C5=b.c5) 

実際には、セットベースの演算子を使用して、あなたがしたいことはできません。あなたのニーズをさらに定義することができれば、おそらく解決策を見つけることができます。