SQL: Как узнать, существует ли набор значений в базе данных?

#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 команду для вызова функции для каждой строки набора.