Как сравнить строковые данные с табличными данными в SQL Server - мне нужно знать, если значение в строке не существует в столбце - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть две таблицы, одна таблица импорта, а другая - ограничение FK для таблицы, в которую таблица импорта будет в конечном итоге помещена. В таблице импорта пользователь может предоставить список значений, разделенных точкой с запятой, которые соответствуют значениям во 2-й таблице.

Итак, мы смотрим на что-то вроде этого:

TABLE 1
ID | Column1
1  | A; B; C; D

TABLE 2
ID  | Column2
1   | A
2   | B
3   | D
4   | E

Требование:

Строки в ТАБЛИЦЕ 1 со значением, отсутствующим в ТАБЛИЦЕ 2 (C в нашем примере), должны быть помечены как недействительные для ручной очистки пользователем Строки, в которых все значения допустимы, обрабатываются другим уже работающим скриптом.

В работе мы будем иметь дело с 6 столбцами, которые необходимо проверять, и импортом по крайней мере 100 тыс. Строк одновременно. В результате я хотел бы выполнить всю работу в БД, а не в другом приложении.

Кстати, это SQL2008.

Я застрял, у кого-нибудь есть идеи. Спасибо!

Ответы [ 4 ]

3 голосов
/ 12 февраля 2009

Мне кажется, вы можете передать значения ID и Column1 из Table1 в функцию с табличными значениями (или встроенную временную таблицу), которая будет анализировать список; -delimited, возвращая отдельные значения для каждой записи.

Вот несколько вариантов:

Результат (ID, value) из функции можно использовать для сравнения (несопоставленный запрос) со значениями в таблице 2.

SELECT tmp.ID
FROM tmp
LEFT JOIN Table2 ON Table2.id = tmp.ID
WHERE Table2.id is null

Результаты сравнения ID будут затем использоваться для пометки записей в таблице 1.

0 голосов
/ 01 июня 2012

Вот простое и понятное решение для идентификаторов недопустимых строк, несмотря на недостаточную производительность из-за манипуляций со строками.

select T1.ID
from [TABLE 1] T1
    left join [TABLE 2] T2
        on ('; ' + T1.COLUMN1 + '; ') like ('%; ' + T2.COLUMN2 + '; %')
where T1.COLUMN1 is not null
group by T1.ID
having count(*) < len(T1.COLUMN1) - len(replace(T1.COLUMN1, ';', '')) + 1

Есть два предположения:

  1. Список, разделенный точкой с запятой, не содержит дубликатов
  2. ТАБЛИЦА 2 не содержит дубликатов в COLUMN2.

Второе предположение можно легко исправить, используя (select distinct COLUMN2 from [TABLE 2]) вместо [TABLE 2].

0 голосов
/ 12 февраля 2009

Если это возможно, попробуйте поместить значения в отдельные строки при импорте (вместо того, чтобы хранить их как; разделенные).

Это может помочь.

0 голосов
/ 12 февраля 2009

Возможно, включение этих составных значений в «ТАБЛИЦУ 1» может показаться наиболее удобным решением за один раз. Однако, если ваши пользователи не используют SQL Server Management Studio или что-то подобное для ввода значений непосредственно в таблицу, тогда я предполагаю, что между пользовательским интерфейсом и базой данных должен быть программный уровень. Если это так, вы избавите себя от многих головных болей как сейчас, так и в долгосрочной перспективе, потратив немного времени на изменение кода, чтобы разделить входные данные, разделенные точкой с запятой, на дискретные значения перед их вставкой в ​​базу данных. В результате «ТАБЛИЦА 1» будет выглядеть примерно так

TABLE 1
ID  | Column1
1   | A
1   | B
1   | C
1   | D

В таком случае написать SQL, чтобы найти те идентификаторы, которые являются недопустимыми, тривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...