Как найти все первичные идентификаторы в таблице A, которые имеют повторяющиеся значения в другом столбце, используя критерии из таблицы B? - PullRequest
0 голосов
/ 04 июня 2019

Извините, если название сбивает с толку, мне было трудно описать мою проблему.

  • Таблица A: содержит номера счетов (PK) и номера социального страхования
  • Таблица B: номера и дата счета закрыты.

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

Сценарий: Мне нужны все номера счетов из таблицы A, которые имеют соответствующий номер социального страхования (также в таблице A) на основе номера счета в таблице B, но мне также нужно добавить Y / N флаг, если номер счета был конкретным номером счета из таблицы B.

Итак, мой ход мыслей : у меня есть список номеров счетов из таблицы B, основанный на конкретной дате закрытия счета:

SELECT TableB.acn 
FROM TableB 
WHERE tableB.CloseDate = '2019-06-30'

И, используя подзапрос, я могу получить список всех учетных записей из таблицы A:

SELECT TableA.Acn, TableA.SSN
FROM Table A
WHERE table A.SSN in (SELECT TableA.SSN 
                      FROM TableA 
                      INNER JOIN TableB ON TableA.ACN = TableB.ACN
                                WHERE tableB.closeDate = '2019-06-30')

Но вот где я в тупике, потому что не знаю, как

  • Добавьте флаг в список, чтобы показать, что Номер счета является номером счета из таблицы B,
  • Удалите все другие учетные записи из таблицы A, которые не имеют дубликата SSN.

Любая помощь будет отличной. Я буду внимательно следить за следующим часом или около того на случай, если у кого-нибудь возникнут дополнительные вопросы.

Спасибо за вашу помощь ТАК.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Попробуйте это sql fiddle

Данные

create table acct_and_ssn (
acct int,
ssn varchar(255) 
);

insert into acct_and_ssn (acct, ssn)
values 
(1, 123456789),
(2, 123456789),
(3, 123456789),
(4, 223456789),
(5, 223456789),
(6, 333456789),
(7, 333456789),
(8, 333456789),
(9, 444567889),
(10, 444567889)
;


create table acct_and_date (
acct int,
mydate date 
);

insert into acct_and_date (acct, mydate)
values 
(2, '06/30/2019'),
(6, '06/30/2019'),
(9, '04/12/2019')
;

Счета 2 и 6 соответствуют нашим строгим критериям.SSN, связанные с 2 и 6, также связаны с учетными записями 1, 3, 7 и 8.

with flagged_accounts_cte (acct, ssn) as
(
select 
a.acct, 
a.ssn

from 
acct_and_ssn a inner join acct_and_date b
on a.acct = b.acct and b.mydate = '06/30/2019'
)
select
c.acct,
c.ssn, 
(case
when c.acct = d.acct then 1 else 0 
 end) as myflag
from 
acct_and_ssn c
inner join flagged_accounts_cte d
on c.ssn = d.ssn

Создайте подзапрос (здесь выполняется как CTE), который идентифицирует закрытые учетные записи, а затем объединяет их обратнодо таблицы с номерами SSN для поиска других учетных записей.

Дает нам

acct ssn myflag 1 123456789 0 2 123456789 1 3 123456789 0 6 333456789 1 7 333456789 0 8 333456789 0

0 голосов
/ 05 июня 2019

Если вы просто хотите флаг о том, есть или нет совпадение, то я думаю, что это делает то, что вы хотите:

SELECT A.Acn, A.SSN,
       (CASE WHEN B.ACN IS NOT NULL THEN 1 ELSE 0 END) as b_flag
FROM A LEFT JOIN
     B
     ON A.ACN = B.ACN AND B.closeDate = '2019-06-30'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...