Как я могу найти повторяющиеся записи \ значения после левого соединения? - PullRequest
3 голосов
/ 22 мая 2019

у меня есть:

  • TABLE1 с идентификатором и именем.
  • TABLE2 с идентификатором и адресом.

Я хочу получить ВСЕ записи TABLE1 и добавить столбец STATUS:

  • Если эта запись существует в ТАБЛИЦЕ 2 - «ОК».
  • Если эта запись не существует в TABLE2, тогда исследуйте совпадение по последним 2 цифрам, иначе «NO_RECORD».
  • Если у этой записи есть дубликаты записей в ТАБЛИЦЕ 2, то если дубликаты записей имеют один и тот же адрес, выберите одну запись - «ОК», а если у них нет одинакового адреса - «ДУБЛИКАТ».

Тем временем я начал с этого:

SELECT t1.id,
 t1.name,
 t2.Address,
 iif(Address is null, 'No_RECORD', 'Ok') as 'status'
FROM Table1 as t1
left join Table2 as t2 on t1.id = t2.id

Например:

Table1

 id     Name
 111    aaa
 222    bbb
 333    ccc 
 444    ddd
 555    eee
 666    fff
 777    ggg
 888    hhh
 999    iii

Table2:

id  Address
111 rr
922 hfh 
444 vbv
444 vbv
555 xxa
555 plo
555 plo
666 wqq
777 gyt
999 ree
999 ree

Мои принятые результаты:

id  name Address 'status'
111 aaa  rr      Ok
222 bbb  hfh     Ok
333 ccc          No_RECORD
444 ddd  vbv     Ok
555 eee          Duplicate
666 fff  fff     Ok
777 ggg  wqq     Ok
888 hhh          No_RECORD
999 iii  ree     Ok
  • 444 не является дубликатом, поскольку адреса записей в 2 таблицах 2 совпадают,
  • 555 является дубликатом, поскольку адрес записей в 3 таблицах 2 не совпадает,
  • 999 не является дубликатом, поскольку адреса записей в 2 таблицах 2 совпадают.
  • 222 все в порядке, потому что 2 последние цифры его идентификатора существуют в tabl2: "922".

Как я могу продолжить? (Я использую sql запрос в доступе).

Ответы [ 2 ]

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

Понятия не имею, что должно означать «совпадение по последним пяти цифрам».Это не имеет ничего общего с вашими примерами данных, поэтому я просто игнорирую эту часть вопроса.

Что вы хотите сделать, это агрегировать на table2 перед выполнением join:

select t1.id, t1.name,
       iif(multiple_addresses = 0, address, null) as address,
       switch(t2.id is null, "No_Record",
              multiple_addresses = 1, "Duplicate",
              1=1, "OK"
             ) as status
from table1 as t1 left join
     (select id, min(address) as address
             iif(min(address) = max(address), min(address), 0, 1) as multiple_addresses
      from table2
      group by id
     ) as t2
     on t1.id = t2.id;
0 голосов
/ 22 мая 2019

Вы можете использовать оператор case, чтобы получить этот статус:

SELECT
 t1.id,
 t1.name,
 t2.Address as add2,
 case 
  when t2.Address is null and exists (select 1 from Table2 temp where temp.id = t1.id) then 'DUPLICATE'
  when t2.Address is null then 'NO_RECORD'
  else 'OK' end
 as 'status'
FROM Table1 as t1
left join Table2 as t2 on t1.id = t2.id and t1.name = t2.Address
order by t1.id

Как вы можете видеть, я добавил and t1.name = t2.Address к предложению объединения, чтобы убедиться, что у вас есть ненулевые значения Table2, только когда вы этого хотите.

Что касается case when, первое условие проверяет, если 1) соответствующая запись не была найдена 2) существуют записи с одинаковым идентификатором, что означает «ДУБЛИРОВАНИЕ». Второе условие проверяет, что нет соответствующей записи, и мы уже знаем, что нет дубликатов (как это было бы в первом случае).

Рабочий SQLFiddle .

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