1

我不是精通 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 作为数据库。

非常感谢,

4

2 回答 2

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 是对的——一旦你这样做了,你应该在这两个表之间建立一个外键关系,以避免将来像这样的僵尸数据!

-- 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)
于 2012-12-24T10:23:03.420 回答
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
    )
于 2012-12-24T11:03:17.573 回答