itsource

열에 고유한 것을 사용하고 다른 열에 대해 순서를 지정하면 오류가 발생합니다.

mycopycode 2023. 7. 1. 08:35
반응형

열에 고유한 것을 사용하고 다른 열에 대해 순서를 지정하면 오류가 발생합니다.

저는 abc_test라는 열이 n_num, k_str인 테이블을 가지고 있습니다.

이 쿼리는 작동하지 않습니다.

    select distinct(n_num) from abc_test order by(k_str)

하지만 이 방법은 효과가 있습니다.

    select n_num from abc_test order by(k_str)

DISTINCT 및 ORDER BY 키워드가 내부적으로 어떻게 작동하여 두 쿼리의 출력이 변경됩니까?

당신의 질문에서 제가 이해한 바로는.

distinct :-는 고유한 값을 선택함을 의미합니다(선택한 모든 값은 고유해야 함).Order By :- 단순히 요구 사항에 따라 선택한 행을 정렬하는 것을 의미합니다.

첫 번째 쿼리의 문제는 예를 들어: 테이블이 있습니다.

ID name
01 a
02 b
03 c
04 d 
04 a

쿼리 제이질은문select distinct(ID) from table order by (name)ID - 04에 대해 어떤 레코드를 사용해야 하는지 혼동됩니다(Name 열에 d와 a라는 두 값이 있기 때문).따라서 DB 엔진의 문제는 (이름)별 주문을 말할 때 발생합니다.......

대신 그룹화 기준을 사용하는 것을 고려할 수 있습니다.

select n_num
from abc_test
group by n_num
order by min(k_str)

첫 번째 쿼리는 불가능합니다.예를 들어 설명하겠습니다.다음 테스트가 있습니다.

n_num k_str
2     a
2     c
1     b

select distinct (n_num) from abc_test이라

2
1

Select n_num from abc_test order by k_str이라

2
1
2

무엇을 반환하시겠습니까?

select distinct (n_num) from abc_test order by k_str?

1과 2만 반품해야 하는데, 어떻게 주문해야 하나요?

확장 정렬 키 열 방법

첫 번째 쿼리에 대한 SQL의 논리적 작업 순서는 다음과 같습니다(간소화).

  • FROM abc_test
  • SELECT n_num, k_str를 들어 확장 정렬 키 열을 추가합니다.
  • ORDER BY k_str DESC
  • SELECT n_num즉, 결과에서 확장 정렬 키 열을 다시 제거합니다.

SQL 표준 확장 정렬 키 열 기능 덕분에 다음에 없는 항목으로 주문할 수 있습니다.SELECT주문 전에 백그라운드에서 일시적으로 추가했다가 주문 후 다시 제거하기 때문입니다.

그렇다면, 왜 이것은 작동하지 않습니까?DISTINCT?

만약 우리가 추가하면,DISTINCT 업작, 사에추합니다야 사이에 .SELECT그리고.ORDER BY:

  • FROM abc_test
  • SELECT n_num, k_str를 들어 확장 정렬 키 열을 추가합니다.
  • DISTINCT
  • ORDER BY k_str DESC
  • SELECT n_num즉, 결과에서 확장 정렬 키 열을 다시 제거합니다.

하지만 이제 확장 정렬을 사용하여 k_str DISTINCT작업이 변경되었으므로 결과가 더 이상 동일하지 않습니다.이것은 우리가 원하는 것이 아니기 때문에 SQL 표준과 모든 합리적인 데이터베이스는 이 사용을 금지합니다.

해결 방법

에 Postgre가 SQL»DISTINCT ON구문. 여기서 정확히 이 작업에 사용할 수 있습니다.

SELECT DISTINCT ON (k_str) n_num
FROM abc_test
ORDER BY k_str DESC

Postgre를 사용하지 않는 경우 다음과 같은 표준 구문으로 에뮬레이트할 수 있습니다.SQL

SELECT n_num
FROM (
  SELECT n_num, MIN(k_str) AS k_str
  FROM abc_test
  GROUP BY n_num
) t
ORDER BY k_str

또는 단순히 (이 경우)

SELECT n_num, MIN(k_str) AS k_str
FROM abc_test
GROUP BY n_num
ORDER BY k_str

여기에 SQL DISTINCT 및 ORDER BY에 대해 자세히 블로그에 올렸습니다.

쿼리의 결과 집합에서 고유한 컬렉션(n_num)을 선택하고 있습니다.따라서 더 이상 k_str 열과 실제 관계가 없습니다.n_num은 k_str에 대해 각각 다른 값을 갖는 두 행으로 구성될 수 있습니다.따라서 k_str로 컬렉션을 구분(n_num)할 수 없습니다.

SQL Standards에 따르면,SELECT절은 최상위 수준의 절("절")로 지칭될 수 있습니다.SELECT순서 위치로 설정된 결과의 절 또는 열. 따라서 쿼리 아래쪽이 준수됩니다.

다른 SQL 구현과 마찬가지로 Oracle을 사용하면 프로젝트에 투영되기 직전에 (논리적으로) 존재했던 열을 참조할 수 있습니다.SELECT이러한 유연성이 그렇게 좋은 것인지 확신할 수 없습니다. IMO는 호출 응용 프로그램에 열/식 등을 포함하여 정렬 순서를 노출하는 것이 좋습니다.SELECT

언제나처럼, 의미 있는 결과를 얻으려면 dsicpline을 적용해야 합니다.첫 번째 쿼리의 경우 순서 정의는 잠재적으로 완전히 임의적입니다.당신은 그 실수에 감사해야 합니다 ;)

이 접근 방식은 SQL Server 2000에서 사용할 수 있으며 테이블에서 고유한 값을 선택하고 고유에 포함되지 않은 다른 열로 정렬할 수 있습니다.그러나 SQL 2012에서는 "SELECT DISTINCT가 지정된 경우 선택 목록에 ORDER BY 항목이 표시되어야 합니다."라는 오류가 발생합니다.

SQL 2000과 동일한 기능을 사용하려면 열 번호를 사용하여 주문할 수 있습니다(최적의 방법에서는 권장하지 않음).

select distinct(n_num) from abc_test order by 1

결과를 가져온 후 첫 번째 열을 정렬합니다.구별되지 않는 다른 열을 기준으로 주문을 수행하려면 select 문에도 해당 열을 추가하고 열 번호를 사용하여 주문해야 합니다.

select distinct(n_num), k_str from abc_test order by 2

동일한 오류가 발생했을 때 다음과 같이 변경하여 해결했습니다.

SELECT n_num 
FROM(
   SELECT DISTINCT(n_num) AS n_num, k_str
   FROM abc_test
) as tbl
ORDER BY tbl.k_str

제 질문이 당신의 질문과 정확히 일치하지는 않지만, 꽤 가깝습니다.

select distinct a.character_01 , (select top 1 b.sort_order from LookupData b where a.character_01 = b.character_01 )
from LookupData a 
where 
Dataset_Name = 'Sample' and status = 200
order by 2, 1

당신은 이것을 시도했습니까?

SELECT DISTINCT n_num as iResult
FROM abc_test 
ORDER BY iResult

할수있습니다

select distinct top 10000 (n_num)  --assuming you won't have more than 10,000 rows                
from abc_test order by(k_str)

언급URL : https://stackoverflow.com/questions/8905840/using-distinct-on-a-column-and-doing-order-by-on-another-column-gives-an-error

반응형