열에 고유한 것을 사용하고 다른 열에 대해 순서를 지정하면 오류가 발생합니다.
저는 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
'itsource' 카테고리의 다른 글
숫자 열거형을 사용하여 유형 스크립트 '기록 <> (0) | 2023.07.01 |
---|---|
"경로를 업데이트하는 동시에 분기로 전환할 수 없음" (0) | 2023.07.01 |
봄 부팅 애플리케이션을 위해 commandLine에서 application.properties를 전달하는 방법은 무엇입니까? (0) | 2023.07.01 |
Oracle에서 SQL 쿼리의 결과 연결 (0) | 2023.07.01 |
Linkq는 먼저 특정 번호로 주문한 다음 모든 나머지 순서를 순서대로 표시합니다. (0) | 2023.07.01 |