Re: Problem with alias/case in query

Поиск
Список
Период
Сортировка
От Stephan Szabo
Тема Re: Problem with alias/case in query
Дата
Msg-id 20050209064402.C18708@megazone.bigpanda.com
обсуждение исходный текст
Ответ на Problem with alias/case in query  ("T. Steneker" <info@tsteneker.nl>)
Список pgsql-novice
On Mon, 7 Feb 2005, T. Steneker wrote:

> Hello,
>
> I'm having a problem with the following pretty large and complicated (for me
> at least ;-)) query:
>
> SELECT Campaign.ID, Campaign.name,
>     CampaignCategory.ID AS categoryID,
>     CampaignCategory.name AS categoryName,
>     (MAX(CampaignProductCommission.impressionCommissionFixed) * 1000) AS
> cpmCommissionFixed,
>     MAX(CampaignProductCommission.clickCommissionFixed) AS
> clickCommissionFixed,
>     MAX(CampaignProductCommission.leadCommissionFixed) AS
> leadCommissionFixed,
>     MAX(CampaignProductCommission.saleCommissionFixed) AS
> saleCommissionFixed,
>     MAX(CampaignProductCommission.saleCommissionVariable) AS
> saleCommissionVariable,
>     CASE WHEN
> CampaignSegment_Affiliate.campaignSegment_AffiliateStatusID >= 2 THEN
>     (
>         CampaignSegment_Affiliate.campaignSegment.ID
>     )
>     ELSE
>     (
>         SELECT CampaignSegment.ID
>         FROM CampaignSegment
>         WHERE CampaignSegment.isGeneral AND
> CampaignSegment.campaignID = Campaign.ID
>     )
>     END AS "selectedSegmentID"
> FROM Campaign
> LEFT JOIN CampaignCategory ON (CampaignCategory.ID =
> Campaign.campaignCategoryID)
> LEFT JOIN CampaignSegment ON (CampaignSegment.campaignID = Campaign.ID)
> LEFT JOIN CampaignSegment_Affiliate ON
> (CampaignSegment_Affiliate.campaignSegmentID = "selectedSegmentID" AND
> CampaignSegment_Affiliate.affiliateID = '" . $this->user->ID . "')
> LEFT JOIN CampaignSegment_CampaignProduct ON
> (CampaignSegment_CampaignProduct.campaignSegmentID = "selectedSegmentID")
> LEFT JOIN CampaignProduct ON (CampaignProduct.ID
>     IN (
>         SELECT campaignProductID
>         FROM CampaignSegment_Affiliate
>         WHERE campaignSegmentID = "selectedSegmentID"
>     ))
> LEFT JOIN CampaignProductCommmission ON
> (CampaignProductCommission.campaignProductID = CampaignProduct.ID)
>
> WHERE Campaign.campaignStatusID = '2'
> GROUP BY Campaign.ID, Campaign.name, Campaign.date, CampaignCategory.ID,
> CampaignCategory.name
> ORDER BY Campaign.date DESC, Campaign.ID DESC
> LIMIT 5 OFFSET 0
>
> So what it should do is this:
>
> Select campaign ID, campaign name, campaign category ID, campaign category
> name and the maximum cpm/click/lead and sale commission for the products in
> the segment the affiliate belongs to.
>
> It is possible that the affiliate doesn't belong to a segment yet
> (CampaignSegment_Affiliate table). In that case it should use the "general"
> segment, identified by the "isGeneral" field in the "CampaignSegment" table.
>
> The problem with this query is that I cannot use "selectedSegmentID" (in the
> CASE) in the LEFT JOIN beneath. Is there any other way I can do this in one
> PGSQL query? Or is there anyone with a hint for me ;-)? I already searched
> google and postgresql's documentation, but didn't find a way to do it yet.

You may want to look at moving the determination of "selectedSegmentID"
into a subquery in the from clause. It looks like you could join with a
subquery that joins CampaignSegment and CampaignSegment_Affiliate which
provides all of their columns plus the selectedSegmentID and then
reference that in the select clause and other joins.

В списке pgsql-novice по дате отправления:

Предыдущее
От: "Rajan Bhide"
Дата:
Сообщение: Re: Finding column using SQL query.
Следующее
От: Michael Fuhr
Дата:
Сообщение: Re: Finding column using SQL query.