2017-09-26 7 views
0

すぐに誰かが私に困惑していることを知っていると思いますので、事前に感謝します。私は名前と郵便番号のフィールドにグループバイを使ってサブクエリを持っています、グループカウント> 1のためにフィルタリングします。私は528グループを取得します。個々の完全なレコードを見たいので、名前と郵便番号のフィールドにこの結果セットを内部結合します。各副照会行は少なくとも2つのレコードを表しているため、少なくとも2つのX 528レコードが最小限になることが予想されます。しかし、私は190行しか得られず、私のロジックの欠陥を理解することはできません。SQLGroup-byサブクエリ

select m1.* 
from MasterList m1 
join 
(
    select FirstName, LastName, Zipcode, count(*) Cnt 
     from MasterList m2 
     group by FirstName, LastName,Zipcode 
     having count(*) > 1 
) x 
on m1.FirstName = x.FirstName and 
m1.LastName = x.LastName and 
m1.Zipcode = x.Zipcode 

十分な詳細が欲しい。私は結合がどのように働いているのか理解してはいけません。しかし、私は結合条件の代わりにフィルター条件を使用する場合と同じ結果になります。

おかげで再び、 JIMK

+0

「各サブクエリー行は少なくとも2つのレコードを表します」は間違っています。 'm1'の各行について、' x'に0または1の行があります。 –

+1

サンプルデータ、期待される結果、およびそれらの説明を提供します。誰かがあなたの仕事を解決するのに役立つかもしれません。 –

+0

xの各行について、 m1に少なくとも2つの行があるはずです。 – user3091705

答えて

0

はあなたがどんなNULL名、姓またはジップコードを持っていますか?場合によっては結果を乱すことがあります。任意のサンプルデータを見ることなく、私は本当にあまりにも多くの助けが、あなたのJOIN句に次のようにやってみてくださいすることはできません。

on isnull(m1.FirstNamem, '') = isnull(x.FirstName, '') and 
isnull(m1.LastName, '') = isnull(x.LastName, '') and 
isnull(m1.Zipcode, '') = isnull(x.Zipcode, '') 
+0

https://technet.microsoft.com/en-us/library/ms190409(v=sql.105).aspx – NonProgrammer

+0

はい、それでした。ありがとうございました。 – user3091705

0

はおそらく、1つのフィールド内のNULL値を持ちます。いずれにしても、ウィンドウ関数はより良いアプローチです。

select m.* 
from (select m.*, count(*) over (partition by FirstName, LastName, Zipcode) as cnt 
     from MasterList m 
    ) m 
where cnt > 1; 
+0

はい、より洗練されたソリューションです。もっと実用的には「より良い」アプローチはどのようになっていますか? – user3091705

+0

@ user3091705。 。 。関数を使用して結合することは、最適化を著しく阻害する可能性があるため、避けてください。これは、SQLエンジンがウィンドウ関数に最適化されているため(Windows関数が 'join'と' group by'の両方を置き換えるため)、より高速に実行されるはずです。さらに、それは自動的に 'NULL'値のために働きます。 –