如何仅在没有子查询的 UNION ALL 中按一个查询进行排序
How to ORDER BY one query only in a UNION ALL without subquery
我正在使用 UNION ALL
从不相关的数据创建一个列表,以便保存到 SQL Server 2008 中的 Excel。只有 SELECT
语句之一将有一个 ORDER BY
,这就是我的问题出现的地方,并显示以下错误消息
'The multi-part identifier "p.Category" could not be bound.'
这是一个简化的工作代码示例,我更喜欢下面的第二个代码示例,但在取消注释第一个 SELECT
查询时中断:
CREATE TABLE #People(Category varchar(50), [Name] varchar(50));
INSERT INTO #People VALUES(1, 'Steve');
INSERT INTO #People VALUES(99, 'Anna');
INSERT INTO #People VALUES(2, 'Sarah');
-- Unrelated data SELECT query
--SELECT 'Best Employee' AS Matrix
-- , 'Alan' AS [Name]
--UNION ALL
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END AS Matrix
, p.name AS [Name]
FROM #People p
ORDER BY p.Category;
DROP TABLE #People;
经过一些研究,我发现我可以按以下方式重写查询,这会在这个小示例中给出我想要的结果,但在我的实际情况下我认为不是理想的结果。有没有一种方法可以在不像下面的工作示例那样诉诸子查询的情况下给我正确的结果?
CREATE TABLE #People(Category varchar(50), [Name] varchar(50));
INSERT INTO #People VALUES(1, 'Steve');
INSERT INTO #People VALUES(99, 'Anna');
INSERT INTO #People VALUES(2, 'Sarah');
SELECT *
FROM
(
-- Unrelated data SELECT query
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
, '' AS Category
UNION ALL
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END Matrix
, p.name AS [Name]
, p.Category Category
FROM #People p
) x
ORDER BY x.Category;
DROP TABLE #People;
如果您的问题是您的排序导致 2 个表混淆,您可以添加一列,以便始终首先显示第一个 select 结果集。
CREATE TABLE #People(Category varchar(50), [Name] varchar(50));
INSERT INTO #People VALUES(1, 'Steve');
INSERT INTO #People VALUES(99, 'Anna');
INSERT INTO #People VALUES(2, 'Sarah');
SELECT Matrix, Name, Category
FROM
(
-- Unrelated data SELECT query
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
, '' AS Category
, 1 as Ord
UNION ALL
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END Matrix
, p.name AS [Name]
, p.Category Category,
2 as Ord
FROM #People p
) x
ORDER BY x.Ord --,Additional Order by columns
ORDER BY
不仅仅适用于一个 SELECT
,它适用于整个结果集,适用于所有行 UNION
ed 后的整个结果。因此,您需要在 UNION ALL
.
的每个 SELECT
中包含将用于排序的列
例如,下面的语法是错误的,因为 ORDER BY
必须在 UNION
的最后一个 SELECT
之后。
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END AS Matrix
, p.name AS [Name]
FROM #People p
ORDER BY p.Category
UNION ALL
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
问题中的第二个例子可以写成更简单的形式,没有子查询:
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END AS Matrix
, p.name AS [Name]
, p.Category
FROM #People p
UNION ALL
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
, NULL AS Category --- or '' AS Category
ORDER BY Category;
在任何情况下,Category
列都必须添加到 UNION
的每个 SELECT
语句中。我不知道如何避免它。
我正在使用 UNION ALL
从不相关的数据创建一个列表,以便保存到 SQL Server 2008 中的 Excel。只有 SELECT
语句之一将有一个 ORDER BY
,这就是我的问题出现的地方,并显示以下错误消息
'The multi-part identifier "p.Category" could not be bound.'
这是一个简化的工作代码示例,我更喜欢下面的第二个代码示例,但在取消注释第一个 SELECT
查询时中断:
CREATE TABLE #People(Category varchar(50), [Name] varchar(50));
INSERT INTO #People VALUES(1, 'Steve');
INSERT INTO #People VALUES(99, 'Anna');
INSERT INTO #People VALUES(2, 'Sarah');
-- Unrelated data SELECT query
--SELECT 'Best Employee' AS Matrix
-- , 'Alan' AS [Name]
--UNION ALL
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END AS Matrix
, p.name AS [Name]
FROM #People p
ORDER BY p.Category;
DROP TABLE #People;
经过一些研究,我发现我可以按以下方式重写查询,这会在这个小示例中给出我想要的结果,但在我的实际情况下我认为不是理想的结果。有没有一种方法可以在不像下面的工作示例那样诉诸子查询的情况下给我正确的结果?
CREATE TABLE #People(Category varchar(50), [Name] varchar(50));
INSERT INTO #People VALUES(1, 'Steve');
INSERT INTO #People VALUES(99, 'Anna');
INSERT INTO #People VALUES(2, 'Sarah');
SELECT *
FROM
(
-- Unrelated data SELECT query
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
, '' AS Category
UNION ALL
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END Matrix
, p.name AS [Name]
, p.Category Category
FROM #People p
) x
ORDER BY x.Category;
DROP TABLE #People;
如果您的问题是您的排序导致 2 个表混淆,您可以添加一列,以便始终首先显示第一个 select 结果集。
CREATE TABLE #People(Category varchar(50), [Name] varchar(50));
INSERT INTO #People VALUES(1, 'Steve');
INSERT INTO #People VALUES(99, 'Anna');
INSERT INTO #People VALUES(2, 'Sarah');
SELECT Matrix, Name, Category
FROM
(
-- Unrelated data SELECT query
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
, '' AS Category
, 1 as Ord
UNION ALL
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END Matrix
, p.name AS [Name]
, p.Category Category,
2 as Ord
FROM #People p
) x
ORDER BY x.Ord --,Additional Order by columns
ORDER BY
不仅仅适用于一个 SELECT
,它适用于整个结果集,适用于所有行 UNION
ed 后的整个结果。因此,您需要在 UNION ALL
.
SELECT
中包含将用于排序的列
例如,下面的语法是错误的,因为 ORDER BY
必须在 UNION
的最后一个 SELECT
之后。
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END AS Matrix
, p.name AS [Name]
FROM #People p
ORDER BY p.Category
UNION ALL
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
问题中的第二个例子可以写成更简单的形式,没有子查询:
SELECT CASE
WHEN p.Category = 1
THEN 'Very Active'
WHEN p.Category = 2
THEN 'Active '
ELSE 'Departed'
END AS Matrix
, p.name AS [Name]
, p.Category
FROM #People p
UNION ALL
SELECT 'Best Employee' AS Matrix
, 'Alan' AS [Name]
, NULL AS Category --- or '' AS Category
ORDER BY Category;
在任何情况下,Category
列都必须添加到 UNION
的每个 SELECT
语句中。我不知道如何避免它。