2

明らかにHAVING句のルールに違反しているために機能しない私のクエリは次のとおりです。

SELECT
      COALESCE(Publisher.name, Affiliate.name) AS Publisher
     ,dbo.SumKeys(Item.id) AS ItemIDs
FROM
    Item
    INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
    INNER JOIN Affiliate ON Item.affid = Affiliate.affid
    INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
    INNER JOIN Campaign ON Item.pid = Campaign.pid
    INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
    LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
GROUP BY
     COALESCE(Publisher.name, Affiliate.name)
    ,ItemAccountingStatus.name
    ,CampaignStatus.name    
HAVING (
    ItemAccountingStatus.name='default'
    and CampaignStatus.name='Verified'
    and Publisher='AdsMain LLC' -- THIS BREAKS THE QUERY
)

質問:これを行う方法はありますか?

4

3 に答える 3

3

having句が必要かどうかは疑問です-以下のようにwhere句で試してください

SELECT
      COALESCE(Publisher.name, Affiliate.name) AS Publisher
     ,dbo.SumKeys(Item.id) AS ItemIDs
FROM
    Item
    INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
    INNER JOIN Affiliate ON Item.affid = Affiliate.affid
    INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
    INNER JOIN Campaign ON Item.pid = Campaign.pid
    INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
    LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
where 
    ItemAccountingStatus.name='default'
    and CampaignStatus.name='Verified'
    and Publisher='AdsMain LLC' 
GROUP BY
     COALESCE(Publisher.name, Affiliate.name)
    ,ItemAccountingStatus.name
    ,CampaignStatus.name    
于 2011-05-05T05:56:00.080 に答える
1
...
and COALESCE(Publisher.name, Affiliate.name) ='AdsMain LLC'
...

列の別名は、ORDER BY でのみ使用できます。WHERE、GROUP BY、HAVING などで (エイリアス化された列を生成する) 式を使用する必要があります。予想どおり、GROUP BY で式を既に使用しています。

一部の DBMS では、他の場所で列のエイリアスを参照できますが、SQL Server では参照できません。これにより、何が起こっているのかがより明確になると思います。

または、派生テーブル/CTE アプローチを使用して、そこから SELECT することもできます (自己回答による)。

MSDN の SELECTに従って、「SELECT ステートメントの論理処理順序」

...逆に、SELECT 句は手順 8 であるため、その句で定義された列のエイリアスまたは派生列は、前の句から参照できません。ただし、ORDER BY 句などの後続の句で参照できます。ステートメントの実際の物理的な実行はクエリ プロセッサによって決定され、順序はこのリストとは異なる場合があることに注意してください。

  1. から
  2. オン
  3. 加入
  4. どこ
  5. グループ化
  6. WITH CUBE または WITH ROLLUP
  7. HAVING (gbn: エイリアスは利用できません)
  8. SELECT (gbn: ここで生成されるエイリアス)
  9. 明確
  10. オーダーバイ
于 2011-05-05T04:55:58.710 に答える
0
SELECT * FROM
(
    SELECT
          COALESCE(Publisher.name, Affiliate.name) AS Publisher
         ,dbo.SumKeys(Item.id) AS ItemIDs
    FROM
        Item
        INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
        INNER JOIN Affiliate ON Item.affid = Affiliate.affid
        INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
        INNER JOIN Campaign ON Item.pid = Campaign.pid
        INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
        LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
    GROUP BY
         COALESCE(Publisher.name, Affiliate.name)
        ,ItemAccountingStatus.name
        ,CampaignStatus.name    
    HAVING (
        ItemAccountingStatus.name='default'
        and CampaignStatus.name='Verified'
    )
) A
WHERE A.Publisher='AdsMain LLC'
于 2011-05-05T04:31:23.067 に答える