UNION ALL on 2 tables select with Cases
UNION ALL on 2 tables select with Cases
我是 运行 SQL Server 2005。我有 2 个 table 具有相同的列,但保存的数据却截然不同。
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
的原因。这一切在每个 table 上都可以正常工作,但我找不到一种方法将它们组合成 1 table 结果与每个 table 订购的结果。
即
4 (Table1)
2 (Table1)
1 (Table1)
3 (Table2)
1 (Table2)
5 (Table2)
2 (Table2)
非常感谢所有帮助。
试试这个:
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
您可以使用以下查询:
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
我是 运行 SQL Server 2005。我有 2 个 table 具有相同的列,但保存的数据却截然不同。
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
的原因。这一切在每个 table 上都可以正常工作,但我找不到一种方法将它们组合成 1 table 结果与每个 table 订购的结果。
即
4 (Table1)
2 (Table1)
1 (Table1)
3 (Table2)
1 (Table2)
5 (Table2)
2 (Table2)
非常感谢所有帮助。
试试这个:
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
您可以使用以下查询:
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