Запрос Oracle для поиска строк в таблице, которые имеют одинаковые значения для столбцов A, B и C, но разные значения для столбца D.

Я хотел бы найти строки в таблице, которые имеют одинаковые значения для столбцов A, B и C, но разные значения для столбца D.

Я имел в виду, что значения в столбце a одинаковы для столбца A, значения для столбца B одинаковы. и т.п.

Если у вас есть таблица сотрудников, мне нужны строки, в которых есть сотрудники с одним и тем же отделом, одним и тем же руководителем, в разных местах.


person OPost    schedule 25.09.2014    source источник
comment
Я имел в виду, что значения в столбце a одинаковы для столбца a, значения для столбца b одинаковы. и т. д. Если у вас есть таблица сотрудников, мне нужны строки, в которых есть сотрудники с одним и тем же отделом, одним и тем же руководителем, в разных местах.   -  person OPost    schedule 25.09.2014
comment
@OPost Вы должны отредактировать свой вопрос при предоставлении дополнительных сведений. Я сделал это для вас. Проверьте это изменение.   -  person Sylvain Leroux    schedule 25.09.2014
comment
... кроме того, вы должны окончательно предоставить как некоторые образцы входных данных, так и ожидаемый результат.   -  person Sylvain Leroux    schedule 25.09.2014
comment
@OPost, если вы предоставите образцы входных данных и ожидаемый результат, как было предложено, вы, вероятно, получите ответ. Сейчас ваш вопрос не ясен.   -  person Ed Gibbs    schedule 25.09.2014


Ответы (3)


Если эти столбцы являются NULLable/необязательными, вы можете использовать NVL или любую другую функцию обработки NULL. Поскольку одно значение NULL не равно другому.

person user3851404    schedule 25.09.2014

Если я правильно понял:

select *
  from YOUR_TABLE t
 where (t.a is not null and t.a = t.b and t.b = t.c and t.a != t.d)
    or (t.a is null and t.b is null and t.is null and t.d is not null)
person neshkeev    schedule 25.09.2014

Если вы просто хотите узнать, какие комбинации отдел/руководитель имеют несколько местоположений, вы можете использовать group by и having:

select department, supervisor, count(distinct location) as locations
from employee e
group by department, supervisor
having count(distinct location) > 1;

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

select id, department, supervisor, location
from (
  select e.*,
    count(distinct location)
      over (partition by department, supervisor) locations
  from employee e
)
where locations > 1
order by id;

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

Внутренний запрос получает исходные данные из таблицы и добавляет столбец с количеством (разных) местоположений отдела/руководителя в этой строке по всему набору результатов — это аналитическая часть. Затем внешний запрос просто отфильтровывает те, которые имеют только одно местоположение.

Краткая демонстрация SQL Fiddle с искусственными данными.

Для вас было бы более значимым, если бы вы включили в вопрос свою фактическую таблицу и образцы данных.

person Alex Poole    schedule 25.09.2014