Фильтрация SQL строк на основе значений из других строк - PullRequest
0 голосов
/ 18 февраля 2020

Использование базы данных SQL Server 2016 SP1 У меня есть эти данные в имени таблицы AgentsTable:

SELECT * FROM AgentsTable;

user_id         first_name  last_name   agent_id   agent_status  agent_code
2003015038088   John        Brown       22307      Retired       12345
2003015038088   John        Brown       22307      Death         12399
4432442556456   Mary        Jane        24667      Active        32133
7746234737464   Harry       Smith       29981      Retired       42354
3455555657677   Mark        Aguy        29654      Active        34655
5436546674465   Sally       Sam         22584      Retired       45464

Вторая строка показывает, что «Джон Браун» мертв (agent_status = «Смерть»), поэтому я хотел бы исключить все строки для этого agent_id, который мертв. (Обратите внимание, что у Джона Брауна есть два разных кода агента, поэтому для каждого кода агента есть одна строка. Вот как исходные данные ...)

Этот запрос:

SELECT * FROM AgentsTable WHERE agent_status = 'Пенсионер';

Вернет это:

user_id          first_name   last_name    agent_id   agent_status  agent_code
2003015038088    John         Brown        22307      Retired       12345
7746234737464    Harry        Smith        29981      Retired       42354
5436546674465    Sally        Sam          22584      Retired       45464

Я хочу получить результат, исключающий Джона Брауна (22307):

user_id          first_name   last_name    agent_id   agent_status  agent_code
7746234737464    Harry        Smith        29981      Retired       42354
5436546674465    Sally        Sam          22584      Retired       45464

Как мне этого добиться? Другими словами, как я могу исключить одну строку на основе значения в другой связанной строке?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

SELECT * FROM AgentsTable t1 WHERE agent_status = 'Удален', где НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ AgentsTable t2 WHERE t2.agent_status = 'Смерть' и t2.agent_code = t1. Agent_code);

0 голосов
/ 18 февраля 2020

Я бы просто использовал not exists с коррелированным подзапросом, чтобы убедиться, что не существует другой записи с таким же user_id и 'Death' состоянием:

select a.*
from agentsTable a
where not exists (
    select 1
    from agentsTable a1
    where a1.user_id = a.user_id and a1.agent_status = 'Death'
)
0 голосов
/ 18 февраля 2020

Вы можете использовать CTE и получить агентов, которые не умерли, как указано ниже:

;WITH CTE_deceasedagents AS
(
SELECT agent_id
FROM AgentsTable
WHERE agent_status = 'Death'
)
SELECT *
FROM AgentsTable as a
WHERE NOT EXISTS
(
SELECT agent_id
FROM CTE_deceasedagents as c
WHERE c.agent_id = a.agent_id
);
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...