Как удалить строки в таблице A, которые находятся в таблице B на основе двух конкретных столбцов - PullRequest
1 голос
/ 05 января 2012

Если у меня есть tableA и tableB с тремя столбцами:

colA | colB | colC

И мне нужно смотреть только на colA и colB

Пока у меня есть это, но он продолжает удалять каждую строку в моей таблицеA:

DELETE

FROM
        dbA.dbo.tableA
WHERE 
        EXISTS(
                SELECT DISTINCT
                       a.colA
                       ,a.colB
                FROM
                        dbB.dbo.tableB b WITH(NOLOCK)
                            INNER JOIN dbA.dbo.tableA a WITH(NOLOCK) ON
                                b.colA = a.colA
                        AND
                                b.colB = b.colB
              )

Очевидно, что я делаю что-то не так, но я ударил стену и не могу понять, почему он все еще удаляет все строки в таблицеA

Спасибо.

Ответы [ 3 ]

5 голосов
/ 06 января 2012
DELETE FROM dbA.dbo.tableA 
WHERE EXISTS
(
  SELECT *
  FROM dbB.dbo.tableB b WITH(NOLOCK) 
  where
      b.colA = dbA.dbo.tableA .colA 
  AND b.colB = dbA.dbo.tableA .colB 
) 
4 голосов
/ 05 января 2012

Попробуйте упрощенную форму:

DELETE dbA.dbo.tableA
FROM dbA.dbo.tableA a WITH(NOLOCK)
JOIN dbB.dbo.tableB b WITH(NOLOCK)
  ON 
      b.colA = a.colA
  AND b.colB = a.colB

И

на самом деле в вашем запросе рядом со строкой

                            b.colB = b.colB

что вызывает дополнительные удаления из таблицы a

AND

Вы можете использовать EXISTS вместо JOIN - как уже упоминалось в ответе @ Stefan, результат будет таким же, но запросбудет более читабельным

1 голос
/ 06 января 2012

Можете ли вы сделать это более простым утверждением?

DELETE
FROM dbA.dbo.TableA a
JOIN dbA.dbo.TableB b ON b.colA = a.colA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...