如何在WHERE子句中使用SELECT语句编写SQL DELETE语句?

Lui*_*ami 67 sql select advantage-database-server where-clause 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')
;
Run Code Online (Sandbox Code Playgroud)

这是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'))
;
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此语句时,我不断收到此错误:

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.
Run Code Online (Sandbox Code Playgroud)

我也试过这句话:

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')
;
Run Code Online (Sandbox Code Playgroud)

结果如下:

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)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我正确构建一个DELETE查询,导致正确的数据被删除吗?

Ale*_*x W 119

您需要在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'));
Run Code Online (Sandbox Code Playgroud)


Mar*_*ese 22

你的第二个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')
Run Code Online (Sandbox Code Playgroud)

更正的查询(选项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')
Run Code Online (Sandbox Code Playgroud)

这里有更多示例:
如何使用INNER JOIN与SQL Server进行删除?


epo*_*och 15

你不应该:

DELETE FROM tableA WHERE entitynum IN (...your select...)
Run Code Online (Sandbox Code Playgroud)

现在你只有一个没有比较的WHERE:

DELETE FROM tableA WHERE (...your select...)
Run Code Online (Sandbox Code Playgroud)

所以你的最终查询看起来像这样;

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')
)
Run Code Online (Sandbox Code Playgroud)