2011-11-10 1 views
1

mysql에서 간단한 삭제로 보이지만 약간의 문제가 있습니다. 이 작업을 수행하려고합니다 :업데이트 대상 테이블을 지정할 수 없습니다. mysql에서 쿼리를 삭제하십시오.

delete from table where col_name not in (select distinct col_name from table); 

이 테이블에는 고유 키가 없습니다. 나는이를하려고하면, 나는 오류가 발생합니다 :

You can't specify target table for update in from clause; ErrorNr. 1093

MySQL의 커뮤니티 5.1

내가이 쿼리의 출력을 저장할 수있는 방법이 있나요 - 온도에>

select distinct col_name from table; 

합니다. 테이블 및 삭제 쿼리에서 사용합니까?

+0

당신이 중복을 삭제 하시겠습니까 더 간단

또 다른 대답. 권리? 그런 다음 고유 키를 추가해야합니다. – Devart

+0

쿼리가 의미가 없으므로 모든 열 값은 반환 된 별개의 'col_name'목록에 있습니다. – Harry

답변

3

별칭을 사용해야합니다.

delete from table where col_name not in (select a.col_name from (select distinct col_name from table) a); 

그래야합니다.

편집 : 죄송합니다. 질문에 대한 오해와 SQL 오류에만 중점을 둡니다. 고유 키가없는 중복 행을 삭제하는 것은 위의 요청에 의해 응답되지 않습니다.

+0

정확한 구문을 사용했지만 오류가 없지만 삭제 된 항목이 없습니다. 예를 들어 테이블이 변경되지 않고 항목이 계속 포함되어 있습니다. 나는 중복 항목이 존재하는지 확인합니다 :'select col_name by col_name by count (*)> 1; ' –

+0

select a.col_name from (select col_name from table) a 원하는 라인을 반환하십시오. 편집 : 귀하의 경우 선택에서 a.col_name을 선택 (선택 col_name에 의해 테이블 ​​그룹에서 col_name을 선택 count (*)> 1) 반환 무언가를 확인하십시오. 그렇지 않으면 내부 쿼리를 확인하십시오. – Molochdaa

+0

고마워, 내가 선택한 'select a.col_name from (count (*)> 1) a'을 가진 col_name으로 테이블 그룹에서 col_name을 선택했다. 그리고 위의 구문 대신 위의 구문 대신 삭제하고자하는 행을 반환했다. this ->'where 테이블에서 col_name을 삭제합니다. (select a.col_name from (count (*)> 1) a)'가있는 테이블 그룹에서 col_name을 선택하십시오. 나는 아직도 당신이 제안한 첫번째 일이 왜 작동하지 않았는지 잘 모르겠다. ... –

0

허용됩니다 @Molochdaa에 의한 대답은 잘못된

설명이다. 이 테이블

col_name | value 
------------------ 
east  | 10 
west  | 15 
east  | 10 
west  | 15 
north | 5 
east  | 10 
north | 5 

테이블 _ 구별 컬럼 이름을 선택 겠지 은 제공 :

col_name 
------------------ 
east  
west  
north  

을 이제 모든 열이 반환 된 목록

에서와 같이 delete from table where col_name not in (...) 후 어떤 행이 반환되지 않습니다 쓸 때 정답은 (@jeffery_the_wind가 제안한)

delete from table where col_name in (
    select a.col_name from (
     select col_name from table group by col_name having count(*)>1 
    ) a 
) 
delete from table_name 
     where rowid not in (select min(rowid) 
          from Table_name 
          group by column1..,column2,...column3..)