【问题标题】:How to query from a hierarchy in oracle如何从oracle中的层次结构中查询
【发布时间】:2012-05-26 19:46:29
【问题描述】:

我使用的 Oracle 数据库包含客户、连锁店和活动表。像这样(精简):

TABLE CUSTOMER 
  ACCOUNTNUMBER   VARCHAR2
  CHAIN           VARCHAR2
  CATEGORY        VARCHAR2

TABLE CHAIN
  CODE            VARCHAR2
  PARENTCHAIN     VARCHAR2

TABLE CAMPAIGN
  ID              NUMBER
  DISCOUNT        NUMBER

TABLE CAMPAIGN_ELIGIBILITY
  CAMPAIGNID      NUMBER   --ID of the campaign
  ACCOUNTNUMBER   VARCHAR2 --Customer included in the campaign
  CHAINCODE       VARCHAR2 --Chain included in the campaign
  CUSTCATCODE     VARCHAR2 --Customercategory included in the campaign

客户可以通过其定义的客户组或作为连锁店的成员,有资格参加特定的活动(基于帐号)。

我使用此查询来查找对给定客户有效的所有广告系列:

select * from campaign where id in
(
  select unique campaignid from campaign_eligibility where 
    accountnumber=:accountnumber
  union
  select unique campaignid from campaign_eligibility where 
    chaincode = 
      (select chain from debtable where accountnumber=:accountnumber)
  union
  select unique campaignid from campaign_eligibility where 
    custcatcode =
      (select category from customer where accountnumber=:accountnumber)
) 

现在,假设客户“Popeye Spinach Empire”是“Spinach Dealers Inc.”连锁店的成员,该连锁店又是更大的连锁店“GreenFud R US”的一部分,而后者又是链“FoAC”。如果有针对“GreenFud R US”的广告系列,Popeye 就有资格参与该广告系列。我的查询将仅返回已明确添加 Popeye 或以“Spinach Dealers Inc.”为目标的广告系列

如何修改我的查询以包含客户间接参与的营销活动?

【问题讨论】:

    标签: sql oracle hierarchy


    【解决方案1】:
    WITH    chains AS
            (
            SELECT  code
            FROM    chain c
            START WITH
                    c.code IN
                    (
                    SELECT  chain
                    FROM    campaign_eligibility
                    WHERE   accountnumber = :acc
                    UNION ALL
                    SELECT  chain
                    FROM    customer c
                    JOIN    campaign_eligibility ce
                    ON      ce.custcatcode = c.category
                    WHERE   accountnumber = :acc
                    UNION ALL
                    SELECT  chain
                    FROM    customer
                    WHERE   accountnumber = :acc
                    )
            CONNECT BY
                    c.code = PRIOR c.parentchain
            ) ch
    SELECT  *
    FROM    campaign
    WHERE   c.id IN
            (
            SELECT  campaignid
            FROM    chains 
            JOIN    campaign_eligibility ce
            ON      ce.chaincode = c.code
            )
    

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      相关资源
      最近更新 更多