删除SQL Server数据ID不存在

时间:2012-12-24 10:17:19

标签: sql sql-server

我不是很了解SQL查询,但我正在尝试构建一个查询,以根据与另一个表(用户)的连接删除任何数据(报告的注释),使用ID来匹配,下面是一个示例模式:

create table tbl_reported_comment(id int, commentId int, reported_by_userid int);

insert tbl_reported_comment values
  (1, 1, 101),
  (2, 2, 131),
  (3, 3, 101),
  (4, 4, 101),
  (5, 5, 24),
  (6, 6, 201),
  (7, 7, 1),
  (8, 8, 24),
  (9, 9, 23),
  (10, 10, 16),
  (11, 11, 31);

Create table tbl_user(userId int, Username varchar(50));

insert tbl_user values
  (1, 'admin'),
  (101, 'test1'),
  (131, 'test2'),
  (24, 'test3'),
  (201, 'test4');

我在这个例子中想要实现的目标如下:

  

删除tbl_reported_comment表中的所有数据   [reported_by_userid]列不存在于用户的[userId]中   表

以下是使用此示例架构的SQLFIDDLE的链接:SQLFiDDLE。我使用SQL Server作为数据库。

非常感谢,

2 个答案:

答案 0 :(得分:3)

这个怎么样?

  DELETE FROM dbo.tbl_reported_comment
  OUTPUT DELETED.id, DELETED.commentId, DELETED.reported_by_userid
  WHERE reported_by_userid NOT IN 
             (SELECT UserID FROM dbo.tbl_user)

这将删除这些行,并将它删除的那些行输出到屏幕(在SQL Server Management Studio中),以便您可以看到删除的内容。

Ben是对的 - 一旦你完成了这个,你应该在这两个表之间建立一个外键关系,以避免将来像这样的 zombie data

-- make your "UserID" column NOT NULL
ALTER TABLE dbo.tbl_user
ALTER COLUMN UserID INT NOT NULL

-- so that we can use it as the PRIMARY KEY for that table!
ALTER TABLE dbo.tbl_user
ADD CONSTRAINT PK_user PRIMARY KEY CLUSTERED(UserID)

-- so that we can then establish a FK relationship between those two tables....
ALTER TABLE dbo.tbl_reported_comment
ADD CONSTRAINT FK_reported_comment_user
FOREIGN KEY (reported_by_userid) REFERENCES dbo.tbl_user(UserID)

答案 1 :(得分:0)

使用EXISTS函数的替代子查询如下:

DELETE x
FROM  tbl_reported_comment x 
WHERE 
   NOT EXISTS 
    (
    SELECT 1
    FROM tbl_user y
    WHERE 
       x.reported_by_userid = y.userId
    )