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其他答案中的嵌套语句更简单.
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)
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)