0
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

两个查询的区别仅在于子句上ASCDESC关键字。ORDER BY

请解释为什么Weight列也用SubTotal.

干杯,

4

3 回答 3

3

结果是一样的,只是结果中记录的顺序发生了变化,因为第一个查询以升序显示结果,第二个查询以降序显示结果。

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

于 2013-07-14T10:00:06.147 回答
3

重量列未排序。它们的顺序是未定义的。它们似乎已排序只是一个巧合。

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

一般来说,如果您没有明确指定排序,则不应对列的排序做出假设。

如果您希望第一个查询按照您显示的顺序进行,并且要明确定义该顺序,则将ORDER BY子句更改为:

ORDER BY c.SubTotal, Weight DESC

然后,如果您想在第二个查询中反转排序,请使用以下命令:

ORDER BY c.SubTotal DESC, Weight

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

于 2013-07-14T10:05:00.603 回答
1

weight列未排序。排序是通过Subtotal升序或降序进行的,我在这里没有发现任何问题。

于 2013-07-14T10:02:45.847 回答