2012-04-13 144 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行。