2012-04-13 80 views
-2

請參閱我下面的查詢: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 

在這其中我得到654105行,這是低於的一個連接的表with_mail_id其中有706795行。

現在,爲了我的目的,我的經理想知道爲什麼我沒有在我的決賽桌中的所有行。我試圖刪除所有的過濾器,但兩個表中的結果仍然不相同。我究竟做錯了什麼?

我不是很擅長SQL,但這件事讓我很困惑。

+1

你有條件加入,兩個WHERE條件,然後你GROUP BY ...,你*仍然*想知道結果中的行數不同於第一個表中的行數?真的嗎? – 2012-04-13 23:08:48

回答

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 

最有可能的事情但是是這只是分組。如果您在兩列上分組並根據該分組選擇各種其他列的最大值,那麼您會希望返回的行數少於原始表,否則爲什麼要麻煩分組?

如果我有這樣的數據:

groupkey1 value 
1   2 
1   10 
2   1 
2   1 

然後,我通過groupkey1組,並選擇MAX(值),我會得到2行[1,2], [2,1],而不是4行。