Рассмотрим следующую таблицу:
select *
from
(values
(1,'a','alex'),
(2,'b','joe'),
(3,'b','alex'),
(4,'c','joe'),
(5,'a','alex'),
(6,'d','cloe')
)as mytable (key_field,field1,field2)
Мне нужен запрос, который выведет строки с ключами 2 и 3.
Логика следующая:
Для каждого значения в field1 создайте список всех значений из field1, а для каждого значения создайте список для всех значений, которые появились вместе с field2, поэтому в нашем случае это будет:
{a : alex, b: joe, alex, c: joe, d: cloe}
Просмотрите все списки для каждого значения field1 и проверьте, существует ли более 1 элемента
b : joe, alex
Вернуть уникальные ключи для необработанных файлов, которые имели такие значения поля 1.
2,3
Я понимаю это как код, но я не знаю, как написать SQL-запрос, который дает мне этот результат?
*************** Решил Йогеш Шарма ***************
Я вставляю полный запрос решения для любой ссылки
Я добавил еще 1 слой к задаче:
Запрос должен возвращать со стадии 2 только пары, содержащие данное имя.
Пример приведенного ниже набора данных с именем «cloe» должен возвращать только строки 4,9.
Если задано имя 'alex', запрос должен возвращать только строки 2,3
declare @field2Compulasory as char(16)
set @field2Compulasory = 'cloe'
;
with CTE1 as
(
select *
from
(values
(1,'a','alex'),
(2,'b','joe'),
(3,'b','alex'),
(4,'c','joe'),
(5,'a','alex'),
(6,'d','cloe'),
(8,'e','bill'),
(9,'c','cloe'),
(10,'g','jenifer'),
(11,'h','fred')
)as mytable (key_field,field1,field2)
),
CTE2 as (
select *
from CTE1 as t
where exists (
select t1.field1
from CTE1 as t1
where 1=1
and t1.field1 = t.field1
and t1.field2 <> t.field2
)
)
select *
from CTE2 as t
where exists (
select *
from CTE2 as t1
where 1=1
and t1.field1 = t.field1
and t1.field2 = @field2Compulasory
)