Найти полные совпадения в одном поле, если оно связано со вторым полем - PullRequest
1 голос
/ 19 января 2020

Буду признателен за некоторую помощь в решении проблемы, которую я надеюсь обоснованно обобщить с помощью двух таблиц ниже:

enter image description here

Таблица 1 содержит первичные необработанные данные, где FieldA имеет связь с указанными c элементами в FieldB.

Элементы в FieldB уникальны по отношению к каждому уникальному элементу в FieldA - то есть кошка, собака, кролик, курица будут только когда-либо появлялись однажды под группой «а» в FieldA (они могут появляться в других местах поля). Аналогично для элементов b, c и d в FieldA (все элементы FieldB отображаются только один раз против каждого).

В Table2 приводится общее количество каждого уникального элемента в Table1, FieldB и генерируется следующим запросом. :

qryCount:

select FieldB, count(FieldB) AS FCount 
from Table1
GROUP BY FieldB;

Моя проблема: Пользователь вводит уникальные значения из FieldA в Table1, тогда запрос должен вернуть все уникальные значения в FieldB (Table1) где достигается полное совпадение по отношению к соответствующему итогу FCount в Таблице 2.

Например,

  • Если пользователь вводит "a, b, d" запрос выводит "cat, собака, кролик, хорьк ", так как общий счет для кошки (3), собаки (2), кролика (1) и хорька (1) встречаются.
  • Если пользователь вводит «a, c», запрос выводит «курица, кролик», так как общее число выполнено для курицы (2) и кролика (1).
  • Если пользователь вводит «b», запрос ничего не возвращает, так как соответствующие элементы FieldB также присутствуют в других местах.

У меня есть эта проблема, решенная с помощью VBA в Excel (создание таблицы совпадений и проверка, имеет ли значение соответствующее общее количество) для введенных пользователем значений), но хотя у меня есть некоторый опыт использования Access SQL (2007), я изо всех сил пытаюсь преобразовать эту идею из VBA. Буду благодарен за помощь.

Ответы [ 2 ]

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

Этот запрос должен дать вам результаты, которые вы хотите. Он использует подзапрос для создания эффективной копии Table2, но только для желаемых значений FieldA. Затем он соединяется с Table2, давая только те строки, в которых совпадают значения FCount:

SELECT t1.FieldB
FROM (SELECT FieldB, COUNT(FieldB) AS FCount
      FROM Table1
      WHERE FieldA IN ('a', 'b', 'd')
      GROUP BY FieldB) t1
INNER JOIN Table2 t2 ON t2.FieldB = t1.FieldB AND t2.FCount = t1.FCount

Вывод:

FieldB
cat
dog
ferret
rabbit

Демонстрация на dbfiddle

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

Если я неправильно понял логику c, я бы предложил следующее:

select distinct t1.fieldb from table1 t1 
where 
    t1.fielda in ('a', 'b', 'd') and 
    not exists 
    (
        select 1 from table1 t2 
        where t2.fieldb = t1.fieldb and t2.fielda not in ('a', 'b', 'd')
    )

Несколько замечаний по поводу вышеперечисленного:

  • Запрос по сути, выбирает записи, для которых значение FieldB появляется только в целевых FieldA группах (в данном случае a, b, d) и ни в каких других группах.

  • Только запрос table1 ссылается на запрос, поскольку агрегация или подсчет не используются.

  • Использование select 1 является исключительно оптимизацией, поскольку мы не Не важно, что возвращает коррелированный подзапрос, но существует только одна или несколько записей - поэтому он может вернуть минимальный объем информации, необходимый для проверки этого.

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