2010-12-05 5 views
2

특정 데이터베이스 항목 당 하나의 행만 반환해야합니다. 예 : 내가있는 경우 :SQL SELECT DISTINCT 및 GROUP BY 문제

ID col1 col2 
1 1 A 
2 1 B 
3 1 C 
4 2 D 
5 3 E 
6 4 F 
7 4 G 

의 MySQL에서 나는 쿼리

SELECT DISTINCT col1, col2 FROM table GROUP BY col1 

를 실행할 수 있습니다 내가 얻을 것이다 -> 내가 원하는,하지만 무엇

ID col1 col2 
1 1 A 
4 2 D 
5 3 E 
6 4 F 

나도 같은 실행하는 경우 SQL Server에서 쿼리 오류가 발생했습니다.

그래서 기본적으로 테이블의 각 행에서 하나 또는 "첫 번째" "col1"및 "col2"만 반환해야합니다.

SQL Server의 올바른 구문은 무엇입니까?

감사합니다.

안드레이

편집 :

MySQL의 작동 전체 쿼리가 ->가

SELECT DISTINCT list_order, category_name, category_id 
FROM `jos_vm_category` 
WHERE `category_publish` = 'Y' 
GROUP BY list_order 

때문에, 각 "list_order"번호를 내가 그에서 CATEGORY_NAME 및 CATEGORY_ID을 반환하려면 동일한 "list_order"번호를 가진 다른 모든 행을 무시하십시오.

+0

@marc_s : OP가 얻는 오류는 SQL Server가 집계 함수의 일부가 아닌 한 모든 SELECT 필드가 GROUP BY 절에 나타나야한다는 것입니다. MySQL은 이것을 요구하지 않는다. –

+0

MSSQL에서 "Column 'jos_vm_category.category_id'는 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않습니다." – Andrej

답변

2

또 다른 접근법은 T-SQL에서 ROW_NUMBER() 함수를 사용하는 것입니다. 여기서 col1과 같이 데이터를 "파티션 분할"하고 해당 데이터 파티션마다 증분 값을 얻습니다. 각 "파티션"에 대한 첫 번째 항목을 원하는 경우에, 다만 그것을 (공통 테이블 식 사용 - CTE)를 이런 식으로 쿼리 :

;WITH Distincts AS 
(
    SELECT ID, col1, col2, 
     ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY ID) AS 'RowNo' 
    FROM dbo.Table 
) 
SELECT 
    ID, col1, col2 
FROM 
    Distincts 
WHERE 
    RowNo = 1 

이 나에게 당신이 찾고있는 출력을 제공합니다.

+1

이 완벽한 woked! 감사! – Andrej

+0

은 내가 늦었다 고 생각합니다 :) .. 그러나 더 간단한 대안 이겠지요. –

+1

@Roopesh - 당신의 대안은 덜 효율적이며 동의하지 않을 것입니다. –

0

SELECT col1, col2 
FROM table t1 
where not exists 
     (select 1 
     from table t2 
     where t2.col1 = t1.col1 and 
       t2.id < t1.id) 

EDIT 다음과 같이 COL1의 값의 첫 번째 인스턴스에 해당하는 모든 행을 얻을 수 있습니다 : 쿼리 의 비교를 게시를 alt text

EDIT2 : 실제 쿼리의 비교를 게시 실행 계획은 약 2000 행의 데이터가 무작위로 생성되고 ID는 고유 인덱스가있는 ID 열입니다. id와 col1의 두 번째 인덱스입니다. alt text

Marc의 쿼리는 결국이 데이터가 빠릅니다.