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');

この場合、私が達成しようとしていることは次のとおりです。

[reported_by_userid]列がuserテーブルに[userId]として存在しないtbl_reported_commentテーブルのデータをすべて削除します

このサンプルスキーマを使用したSQLFIDDLEへのリンクは次のとおりです:SQLFiDDLE。データベースとしてSQLServerを使用しています。

どうもありがとう、

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内)に出力されるため、何が削除されたかを確認できます。

そして、ベンは正しいです-これを行ったら、将来このようなゾンビデータを回避するために、これら2つのテーブル間に外部キー関係を確立する必要があります!

-- 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 に答える