2014-05-14 4 views
0

동일한 ID를 가진 행을 반환하지 않는 SQL 쿼리를 만들려고합니다. 또한 기본 행을 지정하여 두 행의 ID가 동일 할 경우 기본 행이 반환되도록 할 것입니다. 기본 행이 지정되지 않은 경우 첫 번째 행을 반환하고 싶습니다.SQL 쿼리에서 중복 제거

다음은 쿼리하려는 데이터베이스의 예입니다. 여기

+----+---------+-------+ 
| id | primary | label | 
+----+---------+-------+ 
| 1 | Y | A | 
| 1 |   | B | 
| 2 |   | C | 
| 2 |   | D | 
| 3 |   | E | 
+----+---------+-------+ 

는이 문제를 해결하기 위해 추구하는 결과의 예 나는 별개을 선택 사용하려고했습니다

+----+---------+-------+ 
| id | primary | label | 
+----+---------+-------+ 
| 1 | Y | A | 
| 2 |   | C | 
| 3 |   | E | 
+----+---------+-------+ 

달성하기 위해 노력하고하지만 난 방향에 매우 확실 해요입니다 문제. 어떤 도움이라도 대단히 감사합니다. 고맙습니다! 어쩌면 이런 일이 (테스트하지) 작품

+0

"첫 번째 행"은 무엇을 의미합니까? 알파벳순으로 표시된 첫 번째 문자는? 그렇다면 레이블은 항상 구별되는 것입니까? –

+0

데이터베이스의 첫 번째 행을 의미했습니다. 레이블은 행을 구별하는 방법 일 뿐이므로 같은 ID를 가진 행이 결과에 한 번만 나타납니다. – Jacthoma

+0

"데이터베이스에있는 첫 번째 행"은 인덱스/캐싱 등에 따라 의사 랜덤입니다. 삽입 순서를 추적하지 않습니다. –

답변

2

하위 쿼리는 귀하의 경우 DISTINCT보다 더 적합 할 것입니다.

다음을 시도해보십시오. 여기에 원하는 결과를 얻는 데모 데모가 있습니다 : http://sqlfiddle.com/#!2/97fdd3/1/0

그런데 ID의 "기본"이 없으면이 ID의 가장 낮은 레이블 값이 선택됩니다. 이것은 다른 사람들이 '데이터베이스의 순서'보다 더 신뢰할 수 있다고 말한 것과 같습니다.

select * 
    from tbl t 
where t.label = (select x.label 
        from tbl x 
        where x.primary = 'Y' 
        and x.id = t.id) 
    or (not exists 
     (select 1 
      from tbl x 
      where x.primary = 'Y' 
      and x.id = t.id) and 
     t.label = (select min(x.label) from tbl x where x.id = t.id)) 
+0

정말 고마워요! – Jacthoma

0
SELECT a.id, 
     IFNULL(primaries.primary, '') AS primary, 
     IFNULL(primaries.label, secondary.label) AS label 
FROM yourTable AS a 
LEFT JOIN (SELECT * 
      FROM yourTable 
      WHERE primary = 'Y') AS primaries 
ON a.id = primaries.id AND a.label = primaries.label 
LEFT JOIN (SELECT id, MIN(label) AS label 
      FROM yourTable 
      WHERE primary != 'Y' 
      GROUP BY id) AS secondary 
ON a.id = secondary.id AND a.label = secondary.label 
0

는 :

SELECT DISTINCT 
     t1.id 
    ,t2.primary 
    ,t2.label 
FROM table t1 
    LEFT JOIN (
     SELECT id, primary, label 
     FROM table 
     GROUP BY id 
     ORDER BY primary DESC, label ASC 
     LIMIT 1 
    ) t2 ON t2.id=t1.id 
+0

하위 쿼리는 각'id'에 대해 하나의 행을 반환하지 않고 한 행만 반환합니다. – Barmar

+0

예, 내 실수 : ( – DarkSide

1

나는 이미 답변을 얻은 것을 볼 수 있지만 보통 LEFT JOIN을 사용할 수도 있습니다.

SELECT * FROM mytable a 
LEFT JOIN mytable b 
    ON a.id = b.id AND (
      a.label>b.label AND a.primary IS NULL AND b.primary IS NULL OR 
           a.primary IS NULL AND b.primary='Y') 
WHERE b.id IS NULL 

An SQLfiddle to test with.

+0

답장을 보내 주셔서 감사합니다! SQL을 통해 여러 가지 방법으로 작업을 수행하는 방법을 학습하는 것이 좋습니다 – Jacthoma

관련 문제