从表中删除另一个选择的三个键中的两个

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

我很新,很感激任何帮助/建议。

ype*_*eᵀᴹ 5

您的代码是有效的 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)