2017-03-30 5 views
1

UNION ALL을 사용하여 관련이없는 데이터로 목록을 작성하면 SQL Server 2008의 Excel에 저장됩니다. SELECT 문 중 하나만 ORDER BY이고 내 문제는 다음과 같은 오류 메시지가하위 쿼리없이 UNION ALL에서만 하나의 쿼리를 작성하는 방법

'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; 

답변

1

모든 행이 UNION 에드 후 한 SELECT, 그것은 전체 결과, 전체 결과 집합에 적용에는 적용되지 않습니다. 따라서 각 SELECTUNION ALL의 정렬에 사용할 열을 포함해야합니다.

예를 들어, 은 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는 각 SELECT 문에 추가 할 수있다 UNION. 어떻게 피할 수 있는지 모르겠습니다.

0

귀하의 주문으로 인해 2 개의 테이블이 섞이지 않는 경우, 첫 번째 선택 결과 집합이 항상 먼저 표시되도록 열을 추가 할 수 있습니다. ORDER BY

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 
+0

실제로 SELECT 문이 너무 많아서 걱정하지 않아도됩니다. 내 희망은 '주문서'로 진술을 변경하고 나머지는 그대로 두는 것뿐이었습니다. – sams