programing

쿼리가 두 개 이상의 행을 반환하는 경우 SQL 삭제

telebox 2023. 8. 5. 10:03
반응형

쿼리가 두 개 이상의 행을 반환하는 경우 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

반응형