2011-05-05 46 views
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 
) 

问:有没有办法做到这一点?

+0

回答我自己的问题 - 身价离开这个向上或我应该删除吗? – 2011-05-05 04:32:08

+0

我会放弃它 - 如果有人遇到同样的问题,他们可能会很高兴找到答案! – 2011-05-05 04:52:17

+0

@marc_s:答案已添加。这是“为什么我不能在WHERE子句中访问我的列别名”的变体“ – gbn 2011-05-05 04:59:04

回答

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' 
+0

”或者您可以简单地将'和COALESCE(Publisher.name,Affiliate.name)='AdsMain LLC''添加到Having子句中,而不是使用派生表。 – Thomas 2011-05-05 06:07:42

+0

更好的办法是把它放在Where子句中,就像josephj1989 – Thomas 2011-05-05 06:09:23

1
... 
and COALESCE(Publisher.name, Affiliate.name) ='AdsMain LLC' 
... 

列别名只允许在ORDER BY。您必须在WHERE,GROUP BY,HAVING等中使用表达式(用于生成别名列),但您已经按照预期在GROUP BY中使用了表达式。

某些DBMS允许您在其他地方引用列别名,但不引用SQL Server,我认为它更明显地发生了什么。

或者你可以使用派生表/ CTE方法,并从选择(根据你的自我的答案)

SELECT on MSDN

“SELECT语句的逻辑处理顺序”。 ..相反,因为SELECT子句是第8步,所以在该子句中定义的任何列别名或派生列都不能被前面的子句引用。但是,它们可以被后续子句(如ORDER BY子句)引用。请注意,该语句的实际物理执行由查询处理器决定,并且订单可能与此列表不同。

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY WITH CUBE或WITH ROLLUP
  6. HAVING
  7. (GBN:别名不可用)
  8. SELECT(GBN:此处生成的别名)
  9. DISTINCT
  10. ORDER BY
  11. TOP
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  
+0

提示的快速跟进 - 我实际上得到'无效的列名'Publisher''。 – 2011-05-10 20:04:06