복붙노트

[SQL] 어떻게 WHERE 절에 SELECT 문으로 SQL DELETE 문을 작성하는?

SQL

어떻게 WHERE 절에 SELECT 문으로 SQL DELETE 문을 작성하는?

데이타베이스 :베이스의 장점 (11)

정규화 데이터에 대한 나의 탐구에, 나는이 SELECT 문에서 얻는 결과를 삭제하는 것을 시도하고있다 :

SELECT tableA.entitynum
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date')
;

이것은 내가 함께 온 DELETE 문입니다 :

DELETE FROM tableA
WHERE (SELECT q.entitynum
FROM tableA q
INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR q.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date'))
;

나는이 문을 실행하려고 할 때 지속적으로이 오류가 발생합니다 :

ERROR IN SCRIPT: poQuery: Error 7200:  AQE Error:  State = S0000;   NativeError = 2124;
[iAnywhere Solutions][Advantage SQL Engine]Invalid operand for operator: = Boolean value
cannot be operated with non-Boolean value.

나는이 문을 시도했다 :

DELETE FROM tableA 
INNER JOIN tableB u on (u.qlabel = tableA.entityrole AND u.fieldnum = tableA.fieldnum) 
WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
OR tableA.memotext NOT LIKE '%/%/%')
AND (u.FldFormat = 'Date')
;

어떤 결과 :

ERROR IN SCRIPT: poQuery: Error 7200:  AQE Error:  State = 42000;   NativeError = 2117;
[iAnywhere Solutions][Advantage SQL Engine] Unexpected token: INNER -- Expecting semicolon.
-- Location of error in the SQL statement is: 23 (line: 2 column: 1)

제대로 적절한 데이터가 나타날 것 DELETE 쿼리를 작성 누군가 원조 나 제거되고 있을까요?

해결법

  1. ==============================

    1.올바른 레코드를 삭제하기 위해 TableA의 기본 키를 식별해야합니다. 기본 키는 단일 열 또는 고유 테이블의 행을 식별 여러 컬럼의 조합 일 수있다. 기본 키가없는 경우, ROWID 의사 열의 기본 키로서 사용될 수있다.

    올바른 레코드를 삭제하기 위해 TableA의 기본 키를 식별해야합니다. 기본 키는 단일 열 또는 고유 테이블의 행을 식별 여러 컬럼의 조합 일 수있다. 기본 키가없는 경우, ROWID 의사 열의 기본 키로서 사용될 수있다.

    DELETE FROM tableA
    WHERE ROWID IN 
      ( SELECT q.ROWID
        FROM tableA q
          INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
        WHERE (LENGTH(q.memotext) NOT IN (8,9,10) OR q.memotext NOT LIKE '%/%/%')
          AND (u.FldFormat = 'Date'));
    
  2. ==============================

    2.두 번째 DELETE 쿼리는 거의 정확했다. 그냥 당신이에서 삭제되는 테이블 지정 DELETE 사이에서 테이블 이름 (또는 별명)을 넣어해야합니다. 이것은 다른 답변처럼 중첩 된 SELECT 문을 사용하는 것보다 간단합니다.

    두 번째 DELETE 쿼리는 거의 정확했다. 그냥 당신이에서 삭제되는 테이블 지정 DELETE 사이에서 테이블 이름 (또는 별명)을 넣어해야합니다. 이것은 다른 답변처럼 중첩 된 SELECT 문을 사용하는 것보다 간단합니다.

    DELETE tableA
    FROM tableA
    INNER JOIN tableB u on (u.qlabel = tableA.entityrole AND u.fieldnum = tableA.fieldnum) 
    WHERE (LENGTH(tableA.memotext) NOT IN (8,9,10)
    OR tableA.memotext NOT LIKE '%/%/%')
    AND (u.FldFormat = 'Date')
    
    DELETE q
    FROM tableA q
    INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
    WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
    OR q.memotext NOT LIKE '%/%/%')
    AND (u.FldFormat = 'Date')
    

    더 많은 예제 여기 : 어떻게 INNER은 SQL Server에 가입하여 삭제하는 방법?

  3. ==============================

    3.당신은 불가 :

    당신은 불가 :

    DELETE FROM tableA WHERE entitynum IN (...your select...)
    

    이제 당신은 아무 비교와 WHERE 있습니다 :

    DELETE FROM tableA WHERE (...your select...)
    

    그래서 최종 쿼리는 다음과 같을 것이다;

    DELETE FROM tableA WHERE entitynum IN (
        SELECT tableA.entitynum FROM tableA q
          INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
        WHERE (LENGTH(q.memotext) NOT IN (8,9,10) OR q.memotext NOT LIKE '%/%/%')
          AND (u.FldFormat = 'Date')
    )
    
  4. ==============================

    4.이 시나리오에서 :

    이 시나리오에서 :

    DELETE FROM tableA
    WHERE (SELECT q.entitynum
    FROM tableA q
    INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
    WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
    OR q.memotext NOT LIKE '%/%/%')
    AND (u.FldFormat = 'Date'));
    

    당신은 비교 할 열 누락되지 않습니다? 예:

    DELETE FROM tableA
    WHERE entitynum in (SELECT q.entitynum
    FROM tableA q
    INNER JOIN tableB u on (u.qlabel = q.entityrole AND u.fieldnum = q.fieldnum) 
    WHERE (LENGTH(q.memotext) NOT IN (8,9,10) 
    OR q.memotext NOT LIKE '%/%/%')
    AND (u.FldFormat = 'Date'));    
    

    나는 그것이 당신의 선택 진술하면 해당 컬럼에서 삭제하고자하는 것 같은 테이블에서 왔어요 선택에서부터 해당 열 가정합니다.

  5. ==============================

    5.한 번 그런 일을 했습니까 :

    한 번 그런 일을 했습니까 :

    CREATE TABLE exclusions(excl VARCHAR(250));
    INSERT INTO exclusions(excl)
    VALUES
           ('%timeline%'),
           ('%Placeholders%'),
           ('%Stages%'),
           ('%master_stage_1205x465%'),
           ('%Accessories%'),
           ('%chosen-sprite.png'),
    ('%WebResource.axd');
    GO
    CREATE VIEW ToBeDeleted AS 
    SELECT * FROM chunks
           WHERE chunks.file_id IN
           (
           SELECT DISTINCT
                 lf.file_id
           FROM LargeFiles lf
           WHERE lf.file_id NOT IN
                 (
                 SELECT DISTINCT
                        lf.file_id
                 FROM LargeFiles lf
                    LEFT JOIN exclusions e ON(lf.URL LIKE e.excl)
                    WHERE e.excl IS NULL
                 )
           );
    GO
    CHECKPOINT
    GO
    SET NOCOUNT ON;
    DECLARE @r INT;
    SET @r = 1;
    WHILE @r>0
    
    BEGIN
        DELETE TOP (10000) FROM ToBeDeleted;
        SET @r = @@ROWCOUNT  
    END
    GO
    
  6. from https://stackoverflow.com/questions/17548751/how-to-write-a-sql-delete-statement-with-a-select-statement-in-the-where-clause by cc-by-sa and MIT license