Как использовать DELETE с предложением EXCEPT? - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь создать несколько ETL от однобайтовых БД (для каждого клиента) до многопользовательской БД (для всех клиентов, или «глобальных»). В глобальной БД я пытаюсь сохранить таблицу поиска, которая идентифицирует пользователей, связанных с клиентом. Итак, у меня есть это:

Database: Global
Tables: Users and ClientUsers

Database: Client
Tables: Users

После некоторых других операций ETL я хочу очистить таблицу ClientUsers, удалив всех пользователей, которых больше нет в таблице Client.Users. Я думал, что это будет работать:

DECLARE @ClientID varchar = 'ClientA'

DELETE FROM Global.dto.ClientUsers
SELECT ClientID, UserID FROM Global.dto.ClientUsers WHERE ClientID=@ClientID
EXCEPT
SELECT ClientID=@ClientID, UserID FROM ClientA_DB.dbo.Users

Но это удаляет ВСЕ записи. Я проверил отдельные операторы select, и они возвращают то, что я ожидаю для моего первого теста, где нет ни одного, который нужно удалить. Оба оператора select возвращают один и тот же набор данных. Что для меня означает, что никакие записи не должны быть удалены. Правильно? Очевидно, мне не хватает некоторого базового понимания или нюанса о том, как работает EXISTS, потому что, похоже, все должно быть просто!

Я понимаю, что возможно сделать это, используя другие методы, но я озадачен, почему EXCEPT не работает так, как мне кажется.

1 Ответ

2 голосов
/ 29 марта 2019

Причина, по которой он не работает, заключается в том, что вы фактически выполняете два оператора последовательно. Думайте о своем коде больше как:

DECLARE @ClientID varchar = 'ClientA'

DELETE FROM Global.dto.ClientUsers;

SELECT ClientID, UserID FROM Global.dto.ClientUsers WHERE ClientID=@ClientID
EXCEPT
SELECT ClientID=@ClientID, UserID FROM ClientA_DB.dbo.Users;

Если вы хотите изменить оператор Delete, вам нужно следовать за ним Where, Join и т. Д.

Некоторые альтернативные методы для получения желаемого результата приведены в превосходных ответах по адресу: Использование T-SQL, EXCEPT с DELETE / оптимизация запроса

...