为什么结果与以下查询不同

时间:2013-07-14 09:54:52

标签: sql-server-2008

Select 
    d.CompanyName, c.SubTotal, b.Weight 
from 
    ProductAW b 
JOIN 
    SalesOrderDetail a ON a.ProductID = b.ProductID 
JOIN 
    SalesOrderHeader c ON c.SalesOrderID = a.SalesOrderID 
JOIN 
    CustomerAW d ON d.CustomerID = c.CustomerID 
WHERE
    d.CompanyName IN ('Good Toys', 'Transport Bikes') 
ORDER BY 
    c.SubTotal ASC;

//输出

CompanyName        SubTotal    Weight
Transport Bikes     602.19     13213.08
Transport Bikes     602.19        88.00
Good Toys           880.35      1061.40
Good Toys           880.35       988.83

查询#2:

SELECT 
    d.CompanyName, c.SubTotal, b.Weight 
FROM 
    ProductAW b 
JOIN 
    SalesOrderDetail a ON a.ProductID = b.ProductID 
JOIN 
    SalesOrderHeader c ON c.SalesOrderID = a.SalesOrderID 
JOIN 
    CustomerAW d ON d.CustomerID = c.CustomerID 
WHERE 
    d.CompanyName IN ('Good Toys', 'Transport Bikes') 
ORDER BY 
    c.SubTotal DESC;

结果:

CompanyName     SubTotal    Weight
Good Toys         880.35     1061.40
Good Toys         880.35      988.83
Transport Bikes   602.19    13213.08
Transport Bikes   602.19       88.00

ASC子句中两个查询的差异仅为DESCORDER BY关键字。

请解释为什么Weight列也会使用SubTotal进行排序。

干杯,

3 个答案:

答案 0 :(得分:3)

结果相同,只是记录的顺序更改,因为第一个查询按升序显示结果,而秒是按降序显示

<强>更新 权重列没有与 SubTotal 一起排序,只是巧合,它们都按排序顺序显示。并确保通过插入另一个记录来测试查询结果,例如Transport Bikes 602.19 222222.00这条新添加的记录会扭曲weight的整个排序,我可以向您保证。

答案 1 :(得分:3)

重量列未排序。他们的订购是 undefined 。他们似乎是排序的,这只是一个巧合。

根据数据库引擎的实现,当未明确定义排序顺序时,行可能按照它们在表中的插入顺序出现。或不。这实际上取决于实施。

一般情况下,如果未明确指定排序,则不应对列的排序做出假设。

如果您希望第一个查询符合您显示的顺序,并使该顺序定义良好,则将ORDER BY子句更改为:

ORDER BY c.SubTotal, Weight DESC

然后,如果要在第二个查询中反转排序,请使用:

ORDER BY c.SubTotal DESC, Weight

请注意,ASC是可选的,通常是默认的排序方向。

答案 2 :(得分:1)

weight列未排序。排序由Subtotal升序或降序发生 我觉得这里没有错。