我如何阻止底层Order By影响@Result中的所有内容?

时间:2014-11-11 18:44:13

标签: sql sql-server tsql sql-order-by

我需要阻止此SQL底部的Order By SettingID重新排序所有内容。我想订购我的第一个用户ID选择和第二个按OrderID选择。如何在底部订购限制?我试过括号,但我是一个T-SQL初学者,所以无法理解。我尝试使用@ResultA和@ResultB,然后将它们选择到@Result中,但最终结果与底部Order By应用于整个@Result相同。临时表是否可行?如果是这样的话?

  DECLARE @Result TABLE (SettingID INT, GroupID INT, UserID INT)

  INSERT INTO @Result
  SELECT
       SettingID,
       GroupID,
       UserID
  FROM Table1
  WHERE (GroupID = @GroupID AND UserID = @UserID)
  ORDER BY UserID

  INSERT INTO @Result
  SELECT
       SettingID,
       GroupID,
       UserID
   FROM Tabel1
   WHERE (GroupID IS NULL)
   ORDER BY SettingID DESC -- This Order By is reordering everything in @Result.    

   SELECT * FROM @Result  

4 个答案:

答案 0 :(得分:0)

使用逗号添加ORDER BY图层:

SELECT * FROM @Result ORDER BY UserID, OrderID

您可以而且应该在填充表变量的查询中删除订单。

答案 1 :(得分:0)

您不应该依赖表中行的顺序,甚至是表变量。在SQL中,表表示无序集。您可以使用单个查询执行操作:

SELECT SettingID, GroupID, UserID
FROM Table1
ORDER BY (CASE WHEN (GroupID = @GroupID AND UserID = @UserID) THEN 1 ELSE 0 END) DESC,
         GroupID

您可以将其放入表变量中:

INSERT INTO @Result
    SELECT SettingID, GroupID, UserID
    FROM Table1
    ORDER BY (CASE WHEN (GroupID = @GroupID AND UserID = @UserID) THEN 1 ELSE 0 END) DESC,
             GroupID;

但是,你不能假设:

SELECT *
FROM @Result

将以任何特定顺序排列,例如插入顺序。

如果你想这样做,有一个技巧。在临时表中创建一个标识列,并按以下顺序排序:

DECLARE @Result TABLE (
    ResultId INT IDENTITY(1, 1) PRIMARY KEY,
    SettingID INT,
    GroupID INT,
    UserID INT
);

INSERT INTO @Result(SettingID, GroupID, UserID)
    SELECT SettingID, GroupID, UserID
    FROM Table1
    ORDER BY (CASE WHEN (GroupID = @GroupID AND UserID = @UserID) THEN 1 ELSE 0 END) DESC,
             GroupID;

SELECT *
FROM @Result
ORDER BY ResultId;

答案 2 :(得分:0)

表格没有您所感知的记录顺序概念。它只是不存在。

如果您需要保证按特定顺序返回结果,必须在产生这些结果的选择查询上使用ORDER BY。考虑到这一点,您可能只需省略INSERT语句中的ORDER BY子句,并且只将其包含在最终选择中。

更重要的是,如果控制订单是临时表的全部原因,那么你应该真的这样做:

SELECT
   SettingID,
   GroupID,
   UserID
FROM Table1
WHERE (GroupID = @GroupID AND UserID = @UserID) OR @GroupID IS NULL
ORDER BY CASE WHEN GroupID IS NOT NULL THEN 0 ELSE 1 END
       , CASE WHEN GroupID IS NOT NULL THEN UserID ELSE SettingID END

答案 3 :(得分:0)

ORDER BY
CASE WHEN (SettingID between x and y)
THEN UserID
else OrderID END