Sql 使用子查询计算差异

Sql 使用子查询计算差异,sql,oracle,Sql,Oracle,我正在尝试使用子查询来计算两个计算之间的差异。我有一个“国家”表,其中有“人口”和“gnp”字段。试图编写一个查询,查找所有人均国民生产总值大于美国的国家,即国民生产总值/人口。还需要有一个列,其中包括这些国家人均国民生产总值与美国人均国民生产总值之间的差异。我的问题出在差异子查询的某个地方 到目前为止:- SELECT name as Country, gnp/population*1000 as PerCapita, (SELECT (c1.gnp/population*1000)-(c2.

我正在尝试使用子查询来计算两个计算之间的差异。我有一个“国家”表,其中有“人口”和“gnp”字段。试图编写一个查询,查找所有人均国民生产总值大于美国的国家,即国民生产总值/人口。还需要有一个列,其中包括这些国家人均国民生产总值与美国人均国民生产总值之间的差异。我的问题出在差异子查询的某个地方

到目前为止:-

SELECT name as Country, gnp/population*1000 as PerCapita,
(SELECT (c1.gnp/population*1000)-(c2.gnp/population*1000)
FROM country c2
WHERE c2.name = 'United States')
FROM country c1
WHERE gnp/population*1000 > (SELECT gnp/population*1000
FROM country
WHERE country.name = 'United States')
AND population >0;
问题是返回的差值是一个巨大的负数。显然,在子查询中有一个获取差异的问题,但我看不出来

问题是将c1.gnp/population*1000放在我的子查询中。将其移到计算工作之外

SELECT name as Country, gnp/population*1000 as PerCapita, c1.gnp/population*1000 - 
(SELECT c2.gnp/population*1000 
FROM country c2 
WHERE c2.name = 'United States') 
FROM country c1 
WHERE gnp/population*1000 > (SELECT gnp/population*1000 <br>
FROM country 
WHERE country.name = 'United States') 
AND population >0;

我建议预先计算USA值,并使用该值进行比较

通常,尝试执行嵌套子查询的次数越多,性能越差,代码也会变得更加复杂。您通常可以将它们重写为联接,这有助于减少重复执行计算的一些需要

您没有说明使用的是什么RDBMS,因此可能有更有效的方法将比较值放入查询中,例如,将其声明为标量变量值并将其赋值,因此这是最符合ANSI标准的方法:

SELECT name as Country, 
gnp/population*1000 as PerCapita,
gnp/population*1000 - c2.percapita as Difference

FROM country c1 
CROSS JOIN ( SELECT gnp/population*1000  as percapita
             FROM country 
             WHERE country.name = 'United States' ) c2 
WHERE gnp/population*1000 > c2.percapita
AND population >0

人口:C1还是C2?在没有限定条件的情况下它是如何工作的?添加c1.population对差异查询或任何实际操作都没有作用。这只是为了确保没有被0除的错误。@StephLocke,你刚刚使查询更难阅读@斯蒂芬洛克,我看不出你怎么认为这个问题现在更容易理解了。撇开逻辑不谈,这个问题现在更难理解了。我们有一个开发人员,他做了类似的代码格式化,或者说在我们公司里缺少我应该说的东西——最终他被解雇了,因为其他开发人员都厌倦了让他的问题更容易阅读。@I.K.这个网站的目的是提供建设性的答案。如果您对我的格式有异议,请建议对我的答案进行编辑和/或提供详细的批评。目前,高级声明和断言我的格式设置是一个容易引起争议的问题,这使我自己、OP和未来的访问者无法洞察格式设置的不同之处。抱歉,请使用Oracle。我还应该提到,这是一个子查询课程,所以我们应该使用它们而不是联接。谢谢。@user3261297-如果这是家庭作业,你应该添加家庭作业标签,并在你的问题中让人们知道这一点。谢谢托马斯,我会的。