Dae*_*hos 2 sql-server-2005 sql-server delete
我有tableA4 列:
IDA(bigint)、IDB(int)、IDC(varchar(255)) 和comment(varchar(255))。主键是 ( IDA, IDB, IDC)。
我需要删除 ( IDA, IDB)计数大于 1 且comment为“temp”的记录。我想出了以下 SQL 语句:
DELETE FROM tableA WHERE IDA, IDB IN
(SELECT IDA, IDB FROM tableA GROUP BY IDA, IDB HAVING COUNT(*) > 1)
AND comment = 'temp'
但我收到以下错误:“在预期条件的上下文中指定的非布尔类型的表达式,靠近 ','。[...]”
使用 Microsoft SQL Server Enterprise Edition v9.00.3042.00,即 SQL Server 2005 Service Pack 2
我很新,很感激任何帮助/建议。
您的代码是有效的 SQL,但不在 SQL-Server 中。他们还没有实现语法(a,b) IN ((1,11), (2,12), ...)或(a,b) IN (SELECT expa, expb....).
您可以使用EXISTS子查询来解决:
DELETE FROM tableA AS a
WHERE EXISTS
( SELECT 1
FROM tableA AS b
WHERE b.IDA = a.IDA AND b.IDB = a.IDB
HAVING COUNT(*) > 1
)
AND a.comment = 'temp' ;
Run Code Online (Sandbox Code Playgroud)
或者可能更有效地加入:
DELETE a
FROM tableA AS a
JOIN
( SELECT
FROM tableA
GROUP BY IDA, IDB
HAVING COUNT(*) > 1
) AS b
ON b.IDA = a.IDA AND b.IDB = a.IDB
WHERE a.comment = 'temp' ;
Run Code Online (Sandbox Code Playgroud)
使用派生表或 cte(无自联接)甚至更好:
WITH dups AS
( SELECT comment,
cnt = COUNT(*) OVER (PARTITION BY IDA, IDB)
FROM tableA
)
DELETE
FROM dups
WHERE comment = 'temp'
AND cnt > 1 ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2087 次 |
| 最近记录: |