2014-02-05 53 views
-1

我想使用连接而不是内联查询,但我能够做的是给出错误的值。 请检查链接 - http://www.sqlfiddle.com/#!2/57cad/9SQL连接查询 - 连接而不是内联查询

它有2个单独的查询给出正确的值和一个连接查询给出了不正确的结果。这里显示

是否有人可以帮助...

+0

的问题是,你必须被记录在logsmaincontrols_campaigns_daily_stats单个accountpayments 3条记录。联合会提供所有可能的排列组合,因此每个帐户支付的匹配记录将被计为3次。您可能需要加入子查询才能获得想要的结果 – Kickstart

+0

使用子查询会比使用JOINS更有效吗? – user3275103

+0

问题是你并没有真正的选择。子查询通常效率较低(特别是相关联的)比联合,但你有一些行多次返回,因此多次添加到结果。 – Kickstart

回答

1

答:SQLFiddle

你的查询可以在其中做出他们的加入一点比较明显的几个方面加以改进。

在您的第一个查询中,更好的版本具有SELECT子句中列出的GROUP BY子句的列,并且您的HAVING子句(工作时)成为WHERE子句(IMO:最佳做法是仅在HAVING子句:)

SELECT usercode, ROUND(coalesce(sum(paymentamount)*0.99,0),2) AS payment 
FROM accountpayments 
WHERE usercode = 21 
GROUP BY usercode; 

为连接你的第二个查询可以被重写(相对于子查询)

SELECT campaigns.usercode, ROUND(coalesce(sum(lmc_cds.total_spending),0),2) AS total_spending 
FROM logsmaincontrols_campaigns_daily_stats AS lmc_cds 
JOIN campaigns 
    ON campaigns.campcode = lmc_cds.campcode 
WHERE campaigns.usercode = 21; 

由于查询不共享任何表,我决定加入查询彼此作为派生表使用用户代码作为JOI宁列。

SELECT t1.usercode, t1.payment, t2.total_spending 
FROM (SELECT usercode, ROUND(coalesce(sum(paymentamount)*0.99,0),2) AS payment 
     FROM accountpayments 
     WHERE usercode = 21 
     GROUP BY usercode) AS t1 
JOIN (SELECT campaigns.usercode, ROUND(coalesce(sum(lmc_cds.total_spending),0),2) AS total_spending 
     FROM logsmaincontrols_campaigns_daily_stats AS lmc_cds 
     JOIN campaigns 
     ON campaigns.campcode = lmc_cds.campcode 
     WHERE campaigns.usercode = 21) AS t2 
    ON t1.usercode = t2.usercode; 
+0

感谢您的回复。前两个查询就是为了显示支付和总支出的价值是否正确。我只希望用户代码,付款,总支出和budgetstatus的结果(来自广告系列表;忘记包含它)。您的查询确实提供了正确的输出,但我对内联查询有点担心,因为您已经使用过....不能避免内联/子查询吗? – user3275103

+0

谢谢@AgRizzo – user3275103