下面是一个SELECT语句,显示右表中FK表示的记录,但左表没有左表,但左表中没有PK。我想从正确的表中删除具有悬空指针的记录(基本上是来自此结果集的[FACT]记录)。 如何使用我在下面的结果集有效地进行删除?我打算做一个NOT IN子句,但我认为加入父母和孩子需要很长时间/嵌套查询。这就是我首先使用正确加入 而不是使用NOT IN 的全部原因,因为我有数十亿条记录。
SELECT
[FACT].[FK]
FROM
[DIMENSION]
RIGHT JOIN [FACT] ON [FACT].[FK] = [DIMENSION].[PK]
WHERE
[FACT].[TYPE] LIKE 'LAB%' AND [DIMENSION].[PK] IS NULL
答案 0 :(得分:4)
DELETE FROM [FACT]
WHERE NOT EXISTS (SELECT 1
FROM [DIMENSION]
WHERE [FACT].[FK] = [DIMENSION].[PK]
AND [FACT].[TYPE] LIKE 'LAB%')
由于这些是FACT和DIM表,我认为您将删除大量数据,否则您不会太在意性能。删除大量数据时可以考虑的另一件事是,以较小的块删除它。通过执行以下操作
DECLARE @Deleted_Rows INT;
SET @Deleted_Rows = 1;
WHILE (@Deleted_Rows > 0)
BEGIN
-- Delete some small number of rows at a time
DELETE TOP (10000) FROM [FACT]
WHERE NOT EXISTS (SELECT 1
FROM [DIMENSION]
WHERE [FACT].[FK] = [DIMENSION].[PK]
AND [FACT].[TYPE] LIKE 'LAB%')
SET @Deleted_Rows = @@ROWCOUNT;
END
答案 1 :(得分:2)
试试这个:
DELETE FROM [FACT]
WHERE [FACT].[TYPE] LIKE 'LAB%'
AND NOT EXISTS (SELECT 1 FROM [DIMENSION] WHERE [FACT].[FK] = [DIMENSION].[PK]) ;
答案 2 :(得分:1)
如果我理解你的问题。您的上述查询已经从right
表中提取了要删除的所有行。
DELETE FACT
FROM
[DIMENSION]
RIGHT JOIN [FACT] ON [FACT].[FK] = [DIMENSION].[PK]
WHERE
[FACT].[TYPE] LIKE 'LAB%' AND [DIMENSION].[PK] IS NULL