T-SQL:使用RIGHT JOIN时,有效地删除右表中不在左表中的记录

时间:2014-09-25 19:32:34

标签: sql sql-server tsql

下面是一个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

3 个答案:

答案 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