SQL: Как игнорировать дубликаты в операторе выбора, отдавая предпочтение одному типу записи другому? - PullRequest
0 голосов
/ 14 июля 2020

У каждой записи есть идентификатор (случайная строка из чисел и букв), имя (строка) и тип (строка «A» или «B»).

Некоторые записи имеют одинаковый идентификатор и Имя, но разные типы.

Я пытаюсь написать оператор select, который игнорирует записи типа B, когда есть запись с тем же идентификатором типа A.

Насколько Я понимаю, что DISTINCT не будет работать, поскольку он полагается на элементы, совпадающие во всех столбцах, и не может различать на основе столбца.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Используйте NOT EXISTS:

select t.*
from tablename t
where t.type = 'A'
or not exists (select 1 from tablename where id = t.id and name = t.name and type = 'A')

Если name не должно быть включено в условие, используйте следующее:

or not exists (select 1 from tablename where id = t.id and type = 'A')

Или используйте RANK() оконную функцию :

select t.id, t.name, t.type
from (
  select t.*
    rank() over (partition by id, name order by case when type = 'A' then 1 else 2 end) rnk 
  from tablename
) t
where t.rnk = 1

Или удалите name из partition, если это не актуально.

0 голосов
/ 14 июля 2020

Вот один способ ...

    with type_a as
        (select distinct id, name, type
        from table_name 
        where type = 'A'
        ),
        type_b as
        (select distinct id, name, type
        from table_name
        where type = 'B' 
        and id not in (select id from type_a)
        )
    select * from type_a
    union
    select * from type_b
...