2014-02-06 27 views
0

查詢1:

SELECT sum(total_revenue_usd) 
    FROM table1 c 
WHERE c.irt1_search_campaign_id IN (
     SELECT assign_id 
     FROM table2 ga 
         LEFT JOIN table3 d 
            ON d.campaign_id = ga.assign_id 
     ) 

查詢2:

SELECT sum(total_revenue_usd) 
    FROM table1 c 
       LEFT JOIN table2 ga 
          ON c.irt1_search_campaign_id = ga.assign_id 
       LEFT JOIN table3 d 
          ON d.campaign_id = ga.assign_id 

查詢1給了我正確的結果在那裏,因爲我需要它在第二風格不「在」使用。但是查詢2不會給出相同的結果。3桌和2個左聯接

如何在不使用'in'的情況下更改第一個查詢?

其原因是是,小的查詢是一個更大的查詢的一部分,還有其他不會「在」

+0

心不是」它足夠使用JOIN,而不是第一個LEFT JOIN線的東西? – marcosh

+0

在table2中可以有多個行使用相同的assign_id嗎? –

+0

這些其他的條件與'IN'不兼容? – Bridge

回答

1

你可以嘗試沿着

SELECT sum(total_revenue_usd) 
FROM table1 c 
JOIN 
(
    SELECT DISTINCT ga.assign_id 
    FROM table2 ga 
    JOIN table3 d 
    ON d.campaign_id = ga.assign_id 
) x 
ON c.irt1_search_campaign_id = x.assign_id 
0

的查詢做完全不同的事情與工作條件:

第一查詢將table1中存在的irt1_search_campaign_id作爲assign_id的table1中的total_revenue_usd總和。 (順便說一句,table3的外連接是不必要的,因爲它不會改變table2.assign_id是否存在。)當你在表2中尋找存在時,你當然可以用IN替換IN。

第二個查詢可以獲得table1,table2和table3的組合。因此,如果table2中有兩條記錄,而table1中有兩條記錄,並且table3中有兩條記錄,則您將獲得一條table1記錄的六條記錄。因此,你總結其total_revenue_usd六倍。這不是你想要的。不要將table1與其他表連接起來。

編輯:這是使用exists子句的查詢。如上所述,外部連接表3不會改變結果。

Select sum(total_revenue_usd) 
from table1 c 
where exists 
(
    select * 
    from table2 ga 
    -- left join table3 d on d.campaign_id = ga.assign_id 
    where ga.assign_id = c.irt1_search_campaign_id 
);