2014-02-06 26 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 
);