需要帮助解密此SQL代码

时间:2012-08-21 11:53:46

标签: sql

有人可以用简单的术语解释下面的代码吗,它今天早上落在我的办公桌上,我可以阅读它的一些内容,但其他部分只是让我感到困惑,请稍微简要介绍一下这段代码会返回什么在结果方面?

谢谢,这是......

drop table selection_all_journey  purge;   
create table selection_all_journey  as        

select  distinct
    ca.activity_id,
    ca.campaign_code,
    --ca.agent_activity_description,

    case when sl.filter3 = 'DB' then 'RES'
         when sl.filter3 = 'SB' then 'EON'
         when ca.agent_activity_description = 'Additional DM' then 'Trial 6 - DM'
            else ca.agent_activity_description end as agent_activity_description,

    case when ca.channel_id = 'DM' then 'Direct Mail'
         when ca.channel_id = 'EM' then 'Email'
         when ca.channel_id = 'TS' then 'Outbound_Calling'
            else ca.channel_id end as channel_id,

    sl.ice_customer_id,
    sl.account_reference,
    sl.load_date,
    sl.mail_date,
    sl.filter1

from    cam.campaign_activity ca 

join  cam.selection_log sl
    on  ca .activity_id = sl.activity_id  [ OK ]

2 个答案:

答案 0 :(得分:4)

使用SQL最好的办法是查看基础表;通常,JOIN条件或WHERE子句将使您深入了解过程的作者如何理解表之间的关系。

所以,从:

开始
from    cam.campaign_activity ca 

join  cam.selection_log sl on  ca .activity_id = sl.activity_id

这就是所谓的INNER JOIN

这里作者的目的是获取campaign_activityselection_log中具有匹配行的所有行的列表。因此,此查询将根据具有匹配行的所有行进行选择日志匹配的活动ID。

Jeff Atwood对SQL JOIN's here进行了很好的介绍。

下一部分是考虑SELECT列表。

这里有两件事可以让你停下来思考;第一个是使用DISTINCT。这将过滤掉重复的记录。如此有效,如果底层数据中有两行具有完全相同的值,则输出将仅包含其中一行。

第二个是使用CASE语句。这里的作者为数据增加了额外的含义;他们所说的是,例如:

  

当filter3字段是字符串'SB'时,查询应该返回   'EON'。

频道ID也是一样。

当人们想要将数据库字段转换为对查看查询结果的人有意义的值时,人们通常会这样做。他们通常也会用它来将结果值组合在一起。

现在的查询相当简单;如果我不得不猜测,我会说它会带回一系列针对众多客户的营销活动所发生的不同活动。

一旦了解了架构和意图,其余的只是SQL。

我投票结束是因为问题太局部化了,但我希望这能为您提供一些理解模式和查询的帮助!

答案 1 :(得分:2)

基本上,您正在从两个表cam.campaign_activitycam.selection_log中选择记录,并且您正在activity_id进行内部联接。 INNER JOIN仅生成与两个表匹配的记录集。 (见Visual Explanation of JOINs

CASE语句解释:

首先CASE

case when sl.filter3 = 'DB' then 'RES'
     when sl.filter3 = 'SB' then 'EON'
     when ca.agent_activity_description = 'Additional DM' then 'Trial 6 - DM'
        else ca.agent_activity_description end as agent_activity_description

这告诉您要为agent_activity_description获取哪个字段。

  • 如果sl.filter3 = 'DB'则值为'RES'
  • 如果sl.filter3 = 'SB'则值为'EOS'
  • 如果ca.agent_activity_description = 'Additional DM',则值为“试用版6 - DM”
  • 如果它不符合任何这些条件,那么您将使用ca.agent_activity_description
  • 的值

第二个CASE

case when ca.channel_id = 'DM' then 'Direct Mail'
     when ca.channel_id = 'EM' then 'Email'
     when ca.channel_id = 'TS' then 'Outbound_Calling'
        else ca.channel_id end as channel_id,

这告诉您要为channel_id获取哪个字段。

  • 如果ca.channel_id = 'DM'则值为'Direct Mail'
  • 如果ca.channel_id = 'EM'则值为'Email'
  • 如果ca.channel_id = 'TS'则值为'Outbound_Calling'
  • 如果它不符合任何这些条件,那么您将使用ca.channel_id
  • 的值