#sql #sql-server-2008 #set
#sql #sql-server-2008 #установить
Вопрос:
Я должен импортировать строки из файла в базу данных. Я должен проверить, существует ли внешний ключ. Вот пример строк, которые я должен импортировать :
A 481 11/23/1981 12 77000 DESCRIPTION_1 $5,098
A 482 11/23/1981 15 77000 DESCRIPTION_1 $5,098
A 482 11/23/1981 12 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 9 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 12 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 12 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 1 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 1 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 1 77000 DESCRIPTION_1 $5,098
A 481 11/23/1981 1 77000 DESCRIPTION_1 $5,098
Здесь внешний ключ 12, 15, 9, 12, 1. Я хочу проверить, есть ли один из этих внешних ключей. В примере внешний ключ 12 не существует. Самый простой способ — протестировать построчно :
SELECT COUNT(*) From TypeTable WHERE IdType = 12 -- 0
SELECT COUNT(*) From TypeTable WHERE IdType = 15 -- 1
SELECT COUNT(*) From TypeTable WHERE IdType = 9 -- 1
SELECT COUNT(*) From TypeTable WHERE IdType = 12 -- 1
SELECT COUNT(*) From TypeTable WHERE IdType = 1 -- 1
Проблема с этим методом заключается в том, что существует один запрос для каждого отдельного внешнего ключа, а файлы, которые я должен импортировать, содержат тысячи строк (и потенциально тысячи внешних ключей).
Итак, я хочу знать, возможно ли использовать «set feature of SQL» для извлечения в одном запросе, но я не знаю, как это сделать…
PS: В результате моего запроса мне нужно знать, что внешний ключ не существует в базе данных
С уважением,
Флориан
Комментарии:
1. Нет. Я ищу, что такое промежуточная таблица…
Ответ №1:
Если данные были загружены в промежуточную таблицу, вы можете использовать это
SELECT
*
FROM
myStagingTable ST
WHERE
NOT EXISTS (SELECT *
FROM TypeTable TT
WHERE ST.FKCol = TT.IdType)
Чтобы сделать что-то на основе набора, вам нужна таблица с желаемыми значениями FK. Это может быть временная таблица в том же соединении, заполненная путем сканирования файла. Тот же SQL будет работать выше, изменив myStagingTable
на #myFKTable
Ответ №2:
Я бы массово загрузил данные во временную промежуточную таблицу в базе данных, и тогда это стало бы простым случаем запуска SELECT с внешним соединением:
SELECT DISTINCT s.ForeignKeyField
FROM YourStagingTable s
LEFT JOIN FKTable f ON s.ForeignKeyField = f.ID
WHERE f.ID IS NULL -- where the foreign key value does not exist
Ответ №3:
Параметризуйте свой запрос и передавайте внешний ключ в качестве параметра?
IF EXISTS (SELECT * FROM TypeTable WHERE IdType = @foreignKey)
Если вы поместите это в функцию, вы можете использовать CROSS APPLY
команду для вызова функции для каждой строки набора.