[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.올바른 레코드를 삭제하기 위해 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.두 번째 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.당신은 불가 :
당신은 불가 :
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.이 시나리오에서 :
이 시나리오에서 :
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.한 번 그런 일을 했습니까 :
한 번 그런 일을 했습니까 :
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
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
'SQL' 카테고리의 다른 글
[SQL] 봄의 JdbcTemplate의 기본 SQL을보고? (0) | 2020.05.09 |
---|---|
[SQL] MySQL은 : ERROR 1215 (HY000)는 : 외래 키 제약 조건을 추가 할 수 없습니다 (0) | 2020.05.09 |
[SQL] ORA-01795에 대한 해결 방법이 있습니까 : 목록에서 표현의 최대 수 1000 오류가? (0) | 2020.05.09 |
[SQL] 당신은 SQL의 경우 - 당시 다른 논리를 가질 수 있습니까? [복제] (0) | 2020.05.09 |
[SQL] ORACLE에서 슬립 기능 (0) | 2020.05.09 |