我正在运行SQL Server 2005.我有2个表具有相同的列,但保存的数据非常不同。
SELECT *
FROM Table1
WHERE ItemID IN ('4','2','1')
ORDER BY
CASE WHEN ItemID = 4 then 1 WHEN ItemID = 2 then 2 WHEN ItemID = 1 then 3 END
UNION ALL
SELECT *
FROM Table2
WHERE ItemID IN ('3','1','5','2')
ORDER BY
CASE WHEN ItemID = 3 then 4 WHEN ItemID = 1 then 5 WHEN ItemID = 5 then 6 WHEN ItemID = 2 then 7 END
我需要按照选择的顺序保留ItemID
的顺序,这就是我使用CASE
的原因。这一切都适用于每张桌子,但我无法找到一种方法将它们合并到一张结果表中,每张桌子的结果都是有序的。
即
4 (Table1)
2 (Table1)
1 (Table1)
3 (Table2)
1 (Table2)
5 (Table2)
2 (Table2)
非常感谢任何和所有的帮助。
答案 0 :(得分:3)
试试这个:
SELECT *
FROM (
SELECT * , 1 as ord
FROM Table1
WHERE ItemID IN (4, 2, 1)
UNION ALL
SELECT * , 2 as ord
FROM Table2
WHERE ItemID IN (3, 1, 5, 2) ) t
ORDER BY
ord,
CASE WHEN ItemID = 3 then 4 WHEN ItemID = 1 then 5 WHEN ItemID = 5 then 6 WHEN ItemID = 2 then 7 END,
CASE WHEN ItemID = 4 then 1 WHEN ItemID = 2 then 2 WHEN ItemID = 1 then 3 END
或
SELECT *,
ROW_NUMBER() OVER (ORDER BY ord,
CASE WHEN ItemID = 3 then 4 WHEN ItemID = 1 then 5 WHEN ItemID = 5 then 6 WHEN ItemID = 2 then 7 END,
CASE WHEN ItemID = 4 then 1 WHEN ItemID = 2 then 2 WHEN ItemID = 1 then 3 END) as RowNo
FROM (
SELECT * , 1 as ord
FROM Table1
WHERE ItemID IN (4, 2, 1)
UNION ALL
SELECT * , 2 as ord
FROM Table2
WHERE ItemID IN (3, 1, 5, 2) ) t
答案 1 :(得分:1)
您可以使用以下查询:
SELECT Table1.* , x.[Order] AS Ord
FROM Table1
CROSS APPLY (SELECT CASE ItemID
WHEN 4 THEN 1
WHEN 2 THEN 2
WHEN 1 THEN 3
END) x([Order])
WHERE ItemID IN ('4','2','1')
UNION ALL
SELECT Table2.* , y.[Order] AS Ord
FROM Table2
CROSS APPLY (SELECT CASE ItemID
WHEN 3 THEN 4
WHEN 1 THEN 5
WHEN 5 THEN 6
WHEN 2 THEN 7
END) y([Order])
WHERE ItemID IN ('3','1','5','2')
ORDER BY Ord
计算字段[Order]
可确保首先显示Table1
的记录,然后记录Table2
的记录。它还确保在每个Table1
或Table2
分区内进行排序。
这是一种不使用CROSS APPLY
的替代语法:
SELECT Table1.*,
CASE ItemID
WHEN 4 THEN 1
WHEN 2 THEN 2
WHEN 1 THEN 3
END AS Ord
FROM Table1
WHERE ItemID IN ('4','2','1')
UNION ALL
SELECT Table2.*,
CASE ItemID
WHEN 3 THEN 4
WHEN 1 THEN 5
WHEN 5 THEN 6
WHEN 2 THEN 7
END AS Ord
FROM Table2
WHERE ItemID IN ('3','1','5','2')
ORDER BY Ord