我需要阻止此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
答案 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