2009-09-09 16 views
4

나는 각 값은 고유 한 열 A열에서 고유 값을 가져 오는 방법은 무엇입니까?

 A | B | C | D 
    -----|----|----|----- 
1 abc | d0 | e0 | true 
2 def | d0 | e1 | true 
3 ghi | d0 | e2 | true 
4 jkl | d1 | e1 | true 
5 mno | d2 | e2 | false 

아래와 같은 결과 집합을 반환하는 쿼리가 있습니다. B, C, D 열에는 중복 값이 ​​있습니다. 열 A의 모든 값을 원하지만 열 B, C, D의 고유 값이 필요합니다.

예상 결과는 내가 단일 선택 문이 달성하고자하는, 유일한 제약 조건입니다

 A | B | C | D 
    -----|---- |---- |----- 
1 abc | d0 | e0 | true 
2 def | NULL| e1 | NULL 
3 ghi | NULL| NULL| NULL 
4 jkl | d1 | NULL| NULL 
5 mno | d2 | e2 | false 

같은 것입니다. 중첩 된 Select 문이 없습니다.

+1

왜'C'는 행의'NULL'가'이다 3'? – Quassnoi

답변

1
SELECT A, 
     CASE 
     WHEN EXISTS 
       (
       SELECT NULL 
       FROM mytable mi 
       WHERE mi.id < mo.id 
         AND mi.b = mo.b 
       ) THEN NULL 
     ELSE B 
     END AS B, 
     CASE 
     WHEN EXISTS 
       (
       SELECT NULL 
       FROM mytable mi 
       WHERE mi.id < mo.id 
         AND mi.c = mo.c 
       ) THEN NULL 
     ELSE c 
     END AS c, 
     CASE 
     WHEN EXISTS 
       (
       SELECT NULL 
       FROM mytable mi 
       WHERE mi.id < mo.id 
         AND mi.d = mo.d 
       ) THEN NULL 
     ELSE d 
     END AS d 
FROM mytable mo 
+0

예, 이와 비슷한 것입니다. 필터를 외부 쿼리의 from 절뿐 아니라 모든 하위 쿼리에도 넣는 것을 잊지 마십시오. –

+1

A, B, C, D로 주문할 때는 order by 절이 필요합니다. 다른 방법으로 주문하면 B, C 또는 D의 단일 값이 나타나는 행이 첫 번째 행이 아닐 수도 있습니다. 그럼 당신은 실제로 어떤 가치가 있었는지 알지 못합니다. –

+0

"id"열의 출처는 어디입니까? 나에게 OP가 열 번호 (열 이름 또는 대시 없음)를 표시하고있는 것처럼 보입니다. –

0

는 당신이 필요로하는 것은 SQL의 성격에 대하여 사실이다. SQL에서 결과는 순서에 의존하지 않습니다.

(예 : Quassnoi에서 제공 한 것과 같은 결과를 얻는 방법을 찾더라도 SQL에서이 작업을 수행하지 않아야합니다.

+0

나는 당신이 쿼리에서 그것을 할 수 있다면, 동의하지 않습니다. 내 대답을보고 이것이 얼마나 쉽게 달성되는지보십시오. row_number()를 사용하여 각 값의 첫 번째 항목을 찾는 것은 테이블의 일반 select보다 훨씬 어렵지 않습니다. –

+0

당신이 할 수 있다고해서 꼭해야한다는 것은 아닙니다. 또한 성능, 유지 보수성 등을 고려해야합니다. "can"= "should"는 너무 막연합니다. IMHO. – MatBailie

+0

@Dems, SQL에서 세트를 처리하거나 클라이언트 응용 프로그램에서 루프? 가능한 경우 SQL에서 집합을 처리하는 것을 좋아하지만이 경우이 쿼리와 관련됩니다. –

3

이 시도 :

DECLARE @YourTable table (A char(3), B char(2), C char(2), D varchar(5)) 
INSERT INTO @YourTable VALUES ('abc','d0','e0','true') 
INSERT INTO @YourTable VALUES ('def','d0','e1','true') 
INSERT INTO @YourTable VALUES ('ghi','d0','e2','true') 
INSERT INTO @YourTable VALUES ('jkl','d1','e1','true') 
INSERT INTO @YourTable VALUES ('mno','d2','e2','false') 


SELECT 
    A 
    ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY B ORDER BY A,B)=1 THEN B ELSE NULL END AS B 
    ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY C ORDER BY A,C)=1 THEN C ELSE NULL END AS C 
    ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY D ORDER BY A,D)=1 THEN D ELSE NULL END AS D 
    FROM @YourTable 
    ORDER BY A,B,C,D 

출력 :

A B C D 
---- ---- ---- ----- 
abc d0 e0 true 
def NULL e1 NULL 
ghi NULL e2 NULL 
jkl d1 NULL NULL 
mno d2 NULL false 

(5 row(s) affected) 
관련 문제