3

私は、顧客、チェーン、およびキャンペーン用のテーブルを持つ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.」のメンバーであり、チェーン「Spinach Dealers Inc.」が、より大きなチェーン「GreenFud R US」の一部であり、チェーン「FoAC」のメンバーであるとします。 "。「GreenFudRUS」をターゲットにしたキャンペーンがある場合、Popeyeはそのキャンペーンの対象となります。私のクエリは、Popeyeが特別に追加されたキャンペーン、または「SpinachDealersInc。」を対象とするキャンペーンのみを返します。

顧客が間接的に参加しているキャンペーンを含めるようにクエリを変更するにはどうすればよいですか?

4

1 に答える 1

3
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
        )
于 2012-05-26T20:13:43.977 に答える