2014-07-23 4 views
0

일부 행에 중복 값 조건이 있습니다. 중복 값이있는 모든 행을 하나만 제외하고 삭제하려고합니다.하나만 제외하고 쿼리 당 모든 행 선택

SELECT nid, vid, title, hash 
FROM node_revision nr 
WHERE EXISTS 
     (
     SELECT 1 
     FROM node_revision nr 
     WHERE nr.hash = nr.hash 
     LIMIT 1, 1 
     ) 

그러나 나는 모든 가장 낮은 VID와를 제외한 좀하고 싶습니다 :

지금까지 내가 중복 값이 ​​모든 행을 반환하는이,있어. 그 일을 어떻게 하죠? 예를 들어

데이터 :

nid  vid   title      hash 
2065 2081 First news story 77c0f020c160c108ed0f38e572e0ea64 
2065 2082 First news story 77c0f020c160c108ed0f38e572e0ea64 
2065 2083 First news story 77c0f020c160c108ed0f38e572e0ea64 
2065 2084 First news story 77c0f020c160c108ed0f38e572e0ea64 

내가

답변

2
SELECT nr.nid, nr.vid, nr.title, nr.hash 
    FROM node_revision nr 
WHERE EXISTS(
    SELECT 1 
    FROM node_revision nri 
    WHERE nri.vid < nr.vid 
    AND nri.hash = nr.hash  
    ) 

또는 일반 영어 2081.의 VID와 제외한 모든 선택합니다 : '나에게 모든 행을 부여 그곳에는 더 낮은 vid와 같은 해시를 가진 또 다른 행이있다 '

+0

동일한 해시에 대해 가장 낮은 것보다 높은 vid를 가진 모든 행을 원합니다. –

+0

@AndrewAlexander 이것이 바로 이것이하는 일입니다. – Arth

+0

@AndrewAlexander – Arth

0

DELETE FROM node_revision a WHERE EXISTS (SELECT 'X' FROM node_revision b WHERE b.hash = a.hash AND b.vid <> (SELECT min(c.vid) FROM node_revsion c WHERE c.nid = b.nid))

+0

을 받아 - node_revision의 NR nr.hash = nr.hash LIMIT 1, 1 ( SELECT 1 존재 node_revision의 NR 에서 삭제 ) –

+0

내부 선택 AND 내부를 추가하려면 편집을 참조하십시오. – cconklin360

+0

이것은 또한 원하는대로하지 않는 것입니다. 주어진 중복 집합에서 가장 낮은 vid를 가진 노드를 보여줍니다. 나는 데이터를 게시 할 것이다. –

관련 문제