使用左外连接时的order by子句

时间:2013-01-25 17:28:41

标签: sql sql-server sql-server-2005

当我使用左外连接而不是所有行都有列的值时,如何在SQL查询中使用Order by?这是在SQL Server 2005

Select * from Order O
left outer join Order_Selection OS on OS.Order_ColorID = O.Order_ColorID    
order by OS.Order_SelectionID asc

此处并非所有行都有Order_selectionID的值。当我使用DESC时,我想要的订单搞砸了,当我使用ASC时,行会排在最后,因为没有Order_SelectionID的行首先出现。

提前谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用CASE表达式来避免依赖ISNULL(OS.Order_SelectionID, magic_number)

SELECT *
FROM   Order O
       LEFT OUTER JOIN Order_Selection OS
         ON OS.Order_ColorID = O.Order_ColorID
ORDER  BY CASE
            WHEN OS.Order_SelectionID IS NULL THEN 1
            ELSE 0
          END,
          OS.Order_SelectionID 

答案 1 :(得分:-3)

具有Order_selectionID的行真的有必要吗?如果不使用子句来过滤它们:

and Order_selectionID is not null;

或者您可以将null值替换为某个虚拟值,如果您的数据允许: 在Oracle中:

select nvl(Order_selectionID, -1) from...