SQL Сервер: вставить строку в таблицу, поскольку все идентификаторы еще не существуют - PullRequest
0 голосов
/ 15 января 2020

У меня есть три таблицы в MS SQL Сервер, одна с адресами, одна с адресами и одна с назначениями адресов:

Адрес :

IdAddress   | Name   | ...
1           | xyz
2           | abc    |
...

AddressTypes

IdAddresstype | Caption
1             | Customer
2             | Supplier
...

Address2AddressType

IdAddress2AddressType | IdAddress | IdAddressType
1                     | 1         | 2
3                     | 3         | 2

Теперь я хочу вставить строку в Address2AddressType для каждого адреса, что еще не назначен / не появляется в этой таблице с адресом Customer .

Итак, чтобы выбрать эти адреса, я использую этот запрос:

SELECT adresses.IdAddress 
FROM [dbo].[Address] AS adresses
WHERE adresses.IdAddress NOT IN (SELECT adresstypeassignment.IdAddress 
                                 FROM [dbo].[Address2AddressType] AS adresstypeassignment)

Теперь мне нужно найдите способ l oop через все эти результаты вставить так:

INSERT INTO (Address2AddressType (IdAddress, IdAddresstype)
VALUES (<IdAddress from result>, 1)

Может кто-нибудь помочь, пожалуйста?

Заранее спасибо.

С уважением, Ларс

1 Ответ

1 голос
/ 15 января 2020

Использование insert . . . select:

INSERT INTO Address2AddressType (IdAddress, IdAddresstype)
    SELECT a.IdAddress, 1
    FROM [dbo].[Address] a
    WHERE a.IdAddress NOT IN (SELECT ata.IdAddress FROM [dbo].Address2AddressType ata);

Я также упростил псевдонимы таблиц.

Примечание: я не рекомендую NOT IN для этой цели, потому что он не обрабатывает NULL как вы ожидаете (если какие-либо значения, возвращаемые подзапросом, будут NULL , то никакие строки вообще не будут вставлены). Я рекомендую NOT EXISTS вместо:

INSERT INTO Address2AddressType (IdAddress, IdAddresstype)
    SELECT a.IdAddress, 1
    FROM [dbo].[Address] a
    WHERE NOT EXISTS (SELECT 1
                      FROM [dbo].Address2AddressType ata
                      WHERE ata.IdAddress = a.IdAddress
                     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...