반응형
쿼리가 두 개 이상의 행을 반환하는 경우 SQL 삭제
방금 새 URL을 삽입했는데 이전 URL을 삭제하고 싶습니다.
동일한 것이 2개 있는지 확인해야 하고, 있다면 이전 것을 삭제합니다.
하나만 있으면 아무것도 하지 않습니다.
DELETE FROM files
WHERE url
IN (SELECT id FROM files WHERE url='$url' ORDER BY date ASC LIMIT 1)
다음 오류가 발생합니다.
#1235 - 이 버전의 MariaDB는 아직 'LIMIT & IN/ALL/ANY/SOME 하위 쿼리'를 지원하지 않습니다.
제발 도와주세요감사해요.
먼저 중복된 URL을 얻은 다음 사용하여 첫 번째 ID를 찾아야 합니다.Row_Number()
다음과 같이:
DELETE FROM files
WHERE id IN (
SELECT t.id
FROM
(
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY url ORDER BY date ASC) rw
FROM files
WHERE url IN (
SELECT url
FROM files
GROUP BY url
HAVING COUNT(*) > 1
)
) t
WHERE t.rw = 1
)
새 항목이 있는 파일을 삭제하려는 작업은 매우 간단합니다.
DELETE FROM files
WHERE EXISTS
(
SELECT NULL
FROM files newer
WHERE newer.url = files.url AND newer.date > files.date
);
이 문을 지원하는 인덱스는 다음과 같습니다.
CREATE INDEX idx ON files (url, date);
위의 방법이 제가 선호하는 방법일 것입니다.하지만 물론 다른 방법도 있습니다.예를 들어:
DELETE FROM files
WHERE (url, date) NOT IN
(
SELECT url, MAX(date)
FROM files
GROUP BY url
);
이것은 이 진술에도 도움이 될 수 있는 동일한 색인입니다.
두 문 모두 URL에 대한 두 개의 항목이 있는지, 수백 개인지에 관계없이 모든 중복 항목을 제거합니다.
그러나 가장 오래된 행만 삭제하는 경우(URL에 두 개 이상의 항목이 있을 수 없거나 가장 오래된 행을 제외한 중복 항목을 유지하려는 경우), 이렇게 하면 속도가 빨라집니다.
DELETE FROM files
WHERE (url, date) IN
(
SELECT url, MIN(id)
FROM files
-- WHERE url = @url -- add this, if this is only about one URL
GROUP BY url
HAVING COUNT(*) > 1
);
언급URL : https://stackoverflow.com/questions/71756301/sql-delete-if-query-returns-more-than-2-rows
반응형
'programing' 카테고리의 다른 글
유형 ORM 0.3.7 데이터 소스 연결 풀이 갑자기 닫혔습니다. (0) | 2023.08.05 |
---|---|
수행줄 제목에서 사용자 지정 글꼴을 설정하는 방법? (0) | 2023.08.05 |
두 인수를 사용하는 크기 (0) | 2023.08.05 |
Ubuntu Server의 Apache 2.4.6: 서버 구성(PHP FPM)에 의해 클라이언트가 거부됨 [PHP 파일 로드 중] (0) | 2023.08.05 |
응답 XML은 항상 null입니다. (0) | 2023.07.31 |