반응형
WHERE 절에서 SELECT 문을 사용하여 SQL DELETE 문을 작성하는 방법은 무엇입니까?
데이터베이스 : Sybase Advantage 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 쿼리를 올바르게 구성하는 데 도움을 줄 수 있습니까?
올바른 레코드를 삭제하려면 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'));
두 번째 DELETE
쿼리가 거의 정확했습니다. 와 사이에 테이블 이름 (또는 별칭)DELETE
FROM
을 입력하여 삭제할 테이블을 지정하십시오. 이것은 SELECT
다른 답변과 같이 중첩 문을 사용하는 것보다 간단 합니다.
수정 된 쿼리 (옵션 1 : 전체 테이블 이름 사용) :
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')
수정 된 쿼리 (옵션 2 : 별칭 사용) :
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')
여기에 더 많은 예 :
SQL Server에서 INNER JOIN을 사용하여 삭제하는 방법?
하지 말아야 할 것 :
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')
)
이 시나리오에서 :
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'));
select 문에서 해당 열과 함께 삭제하려는 동일한 테이블에서 선택하기 때문에 해당 열이라고 가정합니다.
한 번 그렇게 했어.
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
반응형
'Nice programing' 카테고리의 다른 글
2 개의 어셈블리에 유형이 있습니다. (0) | 2020.11.26 |
---|---|
부트 스트랩 탭 내용에 테두리를 지정하는 방법 (0) | 2020.11.26 |
Jackson ObjectMapper-객체 속성의 직렬화 순서 지정 (0) | 2020.11.26 |
Jenkins 파이프 라인의 조건부 단계 / 단계 (0) | 2020.11.26 |
Python 확장-swig 또는 Cython이 아닌 swig로 (0) | 2020.11.26 |