2012-04-13 10 views
-2

を結合します。私は、のいずれかが706795個の行を持つテーブルwith_mail_idに参加するよりも低くなっている654105個の行を、取得しています。この一SQLクエリと以下の私のクエリを参照してください

select I.OID_CUSTOMER_DIM, I.segment as PISTACHIO_SEGMENT, 
    MAX(CASE WHEN S.SUBSCRIPTION_TYPE = '5' THEN 'Y' ELSE 'N' END) PB_SUBS, 
    max(case when S.SUBSCRIPTION_TYPE ='12' then 'Y' else 'N' end) DAILY_TASTE, 
    MAX(CASE WHEN S.SUBSCRIPTION_TYPE ='8' THEN 'Y' ELSE 'N' END) COOKING_FOR_TWO 
FROM WITH_MAIL_ID i JOIN CUSTOMER_SUBSCRIPTION_FCT S 
ON I.IDENTITY_ID = S.IDENTITY_ID 
WHERE S.SITE_CODE ='PB'and S.SUBSCRIPTION_END_DATE is null 
group by I.oid_customer_dim, I.segment 

ここでは、qcの目的のために、私のマネージャーが最終的なテーブルのすべての行を持っていない理由が不思議です。私はすべてのフィルタを削除しようとしましたが、結果は両方のテーブルで同じではありません。私は間違って何をしていますか?

私はまだSQLはあまり良くありません。このことは本当に私を混乱させています。

+1

条件付きのJOIN、2つのWHERE条件、次にGROUP BY ...があり、結果の行数が最初の表の行数と異なることがまだ疑問ですか?真剣に? –

答えて

2

2つのテーブルでinner joinを実行しているため、WITH_MAIL_IDからCUSTOMER_SUBSCRIPTION_FCTに参加できる行のみが返されます。さらに、グループ句があります。

最初に参加します。結合条件に関係なくすべての行を返す場合は、left joinを使用できますが、この場合はすべてのS列はNULLになりますので、それに対処する必要があります。しかし、それだけでグループ化だということです

select count(*) from WITH_MAIL_ID i 
left join CUSTOMER_SUBSCRIPTION_FCT S 
    on I.IDENTITY_ID = S.IDENTITY_ID 
where s.IDENTITY_ID is NULL 

最も可能性の高いもの:

これを実行すると、あなたは、カウントが表示される場合がありますが違いです。 2つの列をグループ化し、そのグループに基づいて他のさまざまな列の最大値を選択すると、返される行の数が元の表より少ないことが予想されます。私はこのようなデータがある場合は

:groupkey1によって

groupkey1 value 
1   2 
1   10 
2   1 
2   1 

その後、Iグループを、そしてMAX(値)を選択し、私は2行[1,2], [2,1]、ない4行になるだろう。

関連する問題