我想使用连接而不是内联查询,但我能够做的是给出错误的值。 请检查链接 - http://www.sqlfiddle.com/#!2/57cad/9SQL连接查询 - 连接而不是内联查询
它有2个单独的查询给出正确的值和一个连接查询给出了不正确的结果。这里显示
是否有人可以帮助...
我想使用连接而不是内联查询,但我能够做的是给出错误的值。 请检查链接 - http://www.sqlfiddle.com/#!2/57cad/9SQL连接查询 - 连接而不是内联查询
它有2个单独的查询给出正确的值和一个连接查询给出了不正确的结果。这里显示
是否有人可以帮助...
你的查询可以在其中做出他们的加入一点比较明显的几个方面加以改进。
在您的第一个查询中,更好的版本具有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;
感谢您的回复。前两个查询就是为了显示支付和总支出的价值是否正确。我只希望用户代码,付款,总支出和budgetstatus的结果(来自广告系列表;忘记包含它)。您的查询确实提供了正确的输出,但我对内联查询有点担心,因为您已经使用过....不能避免内联/子查询吗? – user3275103
谢谢@AgRizzo – user3275103
的问题是,你必须被记录在logsmaincontrols_campaigns_daily_stats单个accountpayments 3条记录。联合会提供所有可能的排列组合,因此每个帐户支付的匹配记录将被计为3次。您可能需要加入子查询才能获得想要的结果 – Kickstart
使用子查询会比使用JOINS更有效吗? – user3275103
问题是你并没有真正的选择。子查询通常效率较低(特别是相关联的)比联合,但你有一些行多次返回,因此多次添加到结果。 – Kickstart