SQL查询和连接

时间:2012-04-13 21:08:48

标签: sql join

请参阅下面的查询:

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行,这些行低于具有706795行的联接表with_mail_id

现在,为了qc的目的,我的经理想知道为什么我没有在我的决赛桌中拥有所有的行。我试图删除所有过滤器,但两个表中的结果仍然不一样。我做错了什么?

我的SQL还不是很好,这件事让我很困惑。

1 个答案:

答案 0 :(得分:2)

您正在对这两个表执行inner join,因此只返回可以与CUSTOMER_SUBSCRIPTION_FCT连接的WITH_MAIL_ID行。另外,你有一个组子句。

首先加入。如果要返回所有行而不考虑连接条件,可以使用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行。