복붙노트

[SQL] DISTINCT SELECT가 지정된 경우 ORDER BY 항목이 SELECT 목록에 나타나야합니다

SQL

DISTINCT SELECT가 지정된 경우 ORDER BY 항목이 SELECT 목록에 나타나야합니다

나는 목록에 의한 순서로 선택 목록에 열을 추가,하지만 여전히 나에게 오류를주고있다 :

SELECT DISTINCT가 지정된 경우 ORDER BY 항목이 SELECT 목록에 나타나야합니다.

여기에 저장된 프로 시저입니다 :

CREATE PROCEDURE [dbo].[GetRadioServiceCodesINGroup] 
@RadioServiceGroup nvarchar(1000) = NULL
AS
BEGIN
SET NOCOUNT ON;

SELECT DISTINCT rsc.RadioServiceCodeId,
                rsc.RadioServiceCode + ' - ' + rsc.RadioService as RadioService
FROM sbi_l_radioservicecodes rsc
INNER JOIN sbi_l_radioservicecodegroups rscg 
ON rsc.radioservicecodeid = rscg.radioservicecodeid
WHERE rscg.radioservicegroupid IN 
(select val from dbo.fnParseArray(@RadioServiceGroup,','))
OR @RadioServiceGroup IS NULL  
ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService

END

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    ORDER BY 1, 2
    

    또는

    ORDER BY rsc.RadioServiceCodeId, rsc.RadioServiceCode + ' - ' + rsc.RadioService
    
  2. ==============================

    2.그들은 같은 일이 아니지만 모든 DISTINCT 재 작성 대신 GROUP BY를 사용 할 수 있기 때문에, DISTINCT 한 의미에서 GROUP BY를 의미한다. 그걸 염두에두고, 그것은 집계 그룹에없는 무언가에 의해 순서 이해가되지 않습니다.

    그들은 같은 일이 아니지만 모든 DISTINCT 재 작성 대신 GROUP BY를 사용 할 수 있기 때문에, DISTINCT 한 의미에서 GROUP BY를 의미한다. 그걸 염두에두고, 그것은 집계 그룹에없는 무언가에 의해 순서 이해가되지 않습니다.

    예를 들어, 다음과 같은 테이블이있는 경우 :

    col1  col2
    ----  ----
     1     1
     1     2
     2     1
     2     2
     2     3
     3     1
    

    다음이처럼 쿼리하려고 :

    SELECT DISTINCT col1 FROM [table] WHERE col2 > 2 ORDER BY col1, col2
    

    행 당 여러 COL2 값 인이 끝날 수 있기 때문에 즉, 아무 의미가 없을 것입니다. 그것은 주문 어느 하나를 사용해야합니까? 물론,이 쿼리는 결과가 그렇게되지 않을 것 알고 있지만, 데이터베이스 서버는 미리 알고 수 없습니다.

    지금, 당신의 경우는 약간의 다른입니다. 당신은 select 절에 ORDER BY 절에서 모든 열을 포함, 따라서 그것은 그들이 모든 그룹화 된 첫 번째 눈에 보인다. 그러나 이러한 열 중 일부는 계산 된 필드에 포함되었다. 당신이 별개와 함께이 작업을 수행 할 때 별개의 지시만을 계산의 최종 결과에 적용 할 수 있습니다 : 그것은 더 이상 계산 소스에 대해 아무것도 알지 못한다.

    이 방법은 서버가 정말 더 이상 그 열을 셀 수 모른다. 그것은 그들이 사용 된 것을 알고 있지만, 계산 작업이 위의 첫 간단한 예제와 유사한 효과가 발생할 수 있습니다 경우는 알 수 없습니다.

    그래서 지금 당신은 열 순서 사용하기 괜찮 것을 서버에게 다른 일을 할 필요가있다. 이 방법은 여러 가지가 있지만,이 방법은 괜찮 작동합니다 :

    SELECT rsc.RadioServiceCodeId,
                rsc.RadioServiceCode + ' - ' + rsc.RadioService as RadioService
    FROM sbi_l_radioservicecodes rsc
    INNER JOIN sbi_l_radioservicecodegroups rscg 
        ON rsc.radioservicecodeid = rscg.radioservicecodeid
    WHERE rscg.radioservicegroupid IN 
        (SELECT val FROM dbo.fnParseArray(@RadioServiceGroup,','))
        OR @RadioServiceGroup IS NULL  
    GROUP BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
    ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
    
  3. ==============================

    3.다음 중 하나를 수행하십시오 :

    다음 중 하나를 수행하십시오 :

    기본 데이터가 주문을 사용할 수 없습니다 - 당신은 실제로 DISTINCT 쿼리의 결과에 나타나는 컬럼들만 주문할 수 있습니다.

  4. ==============================

    4.당신이 연결을 정의 할 때 당신은 당신이 원하는 경우에 순서에 새로운 열의 DISTINCT와 함께 별칭을 사용할 필요가 SQL 2008 일부 예

    당신이 연결을 정의 할 때 당신은 당신이 원하는 경우에 순서에 새로운 열의 DISTINCT와 함께 별칭을 사용할 필요가 SQL 2008 일부 예

    --this works 
    
        SELECT DISTINCT (c.FirstName + ' ' + c.LastName) as FullName 
        from SalesLT.Customer c 
        order by FullName
    
    --this works too
    
        SELECT DISTINCT (c.FirstName + ' ' + c.LastName) 
        from SalesLT.Customer c 
        order by 1
    
    -- this doesn't 
    
        SELECT DISTINCT (c.FirstName + ' ' + c.LastName) as FullName 
        from SalesLT.Customer c 
        order by c.FirstName, c.LastName
    
    -- the problem the DISTINCT needs an order on the new concatenated column, here I order on the singular column
    -- this works
    
        SELECT DISTINCT (c.FirstName + ' ' + c.LastName) 
            as FullName, CustomerID 
            from SalesLT.Customer c 
    
    order by 1, CustomerID
    
    -- this doesn't
    
        SELECT DISTINCT (c.FirstName + ' ' + c.LastName) as FullName 
         from SalesLT.Customer c 
          order by 1, CustomerID
    
  5. ==============================

    5.고유 및 그룹으로는 일반적으로 그들은 모두에 그룹화되는 열을 기반으로 (또는 선택 고유 절에서 선택) 메모리의 '작업'테이블을 만들 ... 서로 다른 목적을 위해, 물건의 같은 종류의 일을 - 그리고 그 웁니다 쿼리가 데이터를 읽는 값이 그렇게 할 필요성을 나타내는 경우에만 새로운 "행"을 추가, 작업 테이블 ...

    고유 및 그룹으로는 일반적으로 그들은 모두에 그룹화되는 열을 기반으로 (또는 선택 고유 절에서 선택) 메모리의 '작업'테이블을 만들 ... 서로 다른 목적을 위해, 물건의 같은 종류의 일을 - 그리고 그 웁니다 쿼리가 데이터를 읽는 값이 그렇게 할 필요성을 나타내는 경우에만 새로운 "행"을 추가, 작업 테이블 ...

    유일한 차이점은,) (카운트) 그룹의 모든 계산 집계 필드의 작업 테이블에 추가 "열"합계 (같은, 거기까지이다, 평균 (), 등 각 기존 행에 대해 갱신 할 필요가 읽어. 고유은 특별한 경우에 ...이 작업을 수행 할 필요가 없습니다 어디 그룹으로 별개의 값은, 그때는 아마 정확히 같은 쿼리 계획이다 (그리고 어떤 집계 열 출력이없는) 얻을 수 있습니다 .... 그것은 두 가지 옵션에 대한 쿼리 실행 계획을 검토하고 무슨 짓을했는지 보는 것도 흥미로울 것입니다 ...

    물론 그건 당신이 무엇을하고 있는지 경우 고유은 가독성을 위해 이동하는 방법이다 (당신의 목적은 중복 행을 제거하는 경우, 당신은 어떤 집계 열을 계산되지 않음)

  6. ==============================

    6.당신은 하위 쿼리를 시도 할 수 있습니다 :

    당신은 하위 쿼리를 시도 할 수 있습니다 :

    SELECT DISTINCT TEST.* FROM (
        SELECT rsc.RadioServiceCodeId,
            rsc.RadioServiceCode + ' - ' + rsc.RadioService as RadioService
        FROM sbi_l_radioservicecodes rsc
           INNER JOIN sbi_l_radioservicecodegroups rscg ON  rsc.radioservicecodeid = rscg.radioservicecodeid
        WHERE rscg.radioservicegroupid IN 
           (select val from dbo.fnParseArray(@RadioServiceGroup,','))
            OR @RadioServiceGroup IS NULL  
        ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
    ) as TEST
    
  7. from https://stackoverflow.com/questions/265628/order-by-items-must-appear-in-the-select-list-if-select-distinct-is-specified by cc-by-sa and MIT license