SQL-запрос - убедитесь, что для каждого значения в () существует строка - PullRequest
5 голосов
/ 12 октября 2010

В настоящее время борется с поиском способа проверки 2 таблиц (эффективно много строк для таблицы A)

У меня есть две таблицы

Таблица A

 ID 
 A
 B 
 C

Таблица соответствует

ID Number
A   1
A   2
A   9
B   1
B   9
C   2

Я пытаюсь написать запрос SQL Server, который в основном проверяет, чтобы убедиться, что для каждого значения в таблице A существует строкадля переменного набора значений (1, 2,9)

Приведенный выше пример неверен, поскольку для каждой записи в A должна быть соответствующая запись в таблице, соответствующая каждому значению (1,2,9).Конечная цель:

Таблица соответствует

ID Number
A   1
A   2
A   9
B   1
B   2
B   9
C   1
C   2
C   9

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

Пожалуйста, дайте мне знать, если вам всем нужны разъяснения.

Ответы [ 3 ]

13 голосов
/ 12 октября 2010

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

  SELECT a.id
    FROM TABLE_A a
    JOIN TABLE_B b ON b.id = a.id
   WHERE b.number IN (1, 2, 9)
GROUP BY a.id
  HAVING COUNT(DISTINCT b.number) = 3

DISTINCT в COUNT гарантирует, что дубликаты (IE: A, имеющие две записи в TABLE_B со значением "2") не будут считаться ошибочными. Его можно опустить, если столбец number имеет ограничение уникального или первичного ключа.

HAVING COUNT(...) должно равняться количеству значений, указанных в предложении IN.

0 голосов
/ 13 октября 2010

У меня была такая ситуация один раз. Мое решение было следующим.

В дополнение к TableA и TableMatched существовала таблица, определяющая строки, которые должны существовать в TableMatched для каждой строки в TableA. Давайте назовем это TableMatchedDomain.

Затем приложение получило доступ к TableMatched через представление, которое контролировало возвращаемые строки, например:

create view TableMatchedView
select  a.ID,
        d.Number,
        m.OtherValues      
from    TableA a
        join TableMatchedDomain d
        left join TableMatched m on m.ID = a.ID and m.Number = d.Number

Таким образом, возвращаемые строки всегда были правильными. Если в TableMatched отсутствовали строки, то числа все равно возвращались, но с другими значениями, равными NULL. Если в TableMatched были дополнительные значения, то они вообще не возвращались, как если бы они не существовали. Изменяя строки в TableMatchedDomain, можно легко управлять этим поведением. Если бы значение было удалено TableMatchedDomain, то оно исчезло бы из представления. Если он будет добавлен снова в будущем, соответствующие значения OtherValues ​​снова появятся, как и прежде.

Причина, по которой я разработал ее таким образом, заключалась в том, что я чувствовал, что установка неизменяемой конфигурации строки в TableMatched была слишком хрупкой и, что еще хуже, привела к избыточности. Поэтому я удалил ограничение для групп строк (в TableMatched) и вместо этого заставил все содержимое другой таблицы (TableMatchedDomain) определить правильную форму данных.

0 голосов
/ 12 октября 2010

Создайте временную таблицу значений, которую вы хотите.Вы можете сделать это динамически, если значения 1, 2 и 9 находятся в некоторой таблице, из которой вы можете запросить.

Затем, SELECT FROM tempTable WHERE NOT IN (SELECT * FROM TableMatched)

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