Выделите все строки из таблицы A, присоединитесь к таблице B по номеру счета, но исключите строки, в которых tableB.foo == bar. Могу ли я получить этот набор данных в одном запросе? - PullRequest
0 голосов
/ 12 мая 2019

Таблица A содержит основную информацию о клиенте, включая номер счета. Каждый действительный номер счета отображается ровно в одной строке таблицы A.

Таблица B содержит информацию о том, какие флаги установлены для каких клиентов. Столбцы в таблице B - это номер счета, ключ флага, значение флага. Большинство номеров счетов отображаются в нескольких строках в таблице B, по одной для каждого флага, установленного для этой учетной записи. Однако некоторые номера счетов не имеют никаких установленных флагов и вообще не отображаются в таблице B. Флаги не имеют настроек по умолчанию и могут быть неопределенными. Если в таблице B нет строки для определенного номера счета и комбинации флагов, этот флаг не определен для этой учетной записи.

Единственный флаг, который нас волнует в этом вопросе - это флаг Foo. Есть много клиентов, у которых Foo настроен на что-то, и многие, у которых его вообще нет.

Цель: выбрать всю информацию о клиенте из таблицы A для всех клиентов, у которых не вообще установлен флаг Foo.

Мое текущее решение, которое работает, выполняет 2 запроса и затем обрабатывает результаты. Один запрос выбирает все строки из таблицы A. Другой запрос выбирает все строки из таблицы A, присоединяются к таблице B по номеру счета, где tableB.FlagKey = Foo.

Затем некоторый код, который я написал, просто перебирает результаты запроса таблицы B и генерирует список номеров счетов. Затем он просматривает результаты запроса таблицы A и просто сохраняет строки с номерами счетов, которые не отображаются в списке номеров счетов, которые я построил.

Это прекрасно работает, но я чувствую, что это "должно" быть возможно сделать в одном запросе к БД, но я не могу понять, как написать этот запрос. Я не очень опытен в написании запросов к БД.

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Попробуйте это-

SELECT * 
FROM TABLE_A
INNER JOIN TABLE_B
    ON A.ACC_NO = B.ACC_NO
WHERE B.FOO <> 'bar'
0 голосов
/ 12 мая 2019

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

select a.*
from a
where not exists (select 1 from b where b.flagkey = 'foo');

Предполагается, что "вообще не установлено" означает, что ключ отсутствует во второй таблице.

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