Как выбрать из таблицы только те строки, в которых значение из поля 1 сопряжено как минимум с двумя разными значениями поля 2 - PullRequest
0 голосов
/ 05 сентября 2018

Рассмотрим следующую таблицу:

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.

Логика следующая:

  1. Для каждого значения в field1 создайте список всех значений из field1, а для каждого значения создайте список для всех значений, которые появились вместе с field2, поэтому в нашем случае это будет:

    {a : alex, b: joe, alex, c: joe, d: cloe}
    
  2. Просмотрите все списки для каждого значения field1 и проверьте, существует ли более 1 элемента

    b : joe, alex
    
  3. Вернуть уникальные ключи для необработанных файлов, которые имели такие значения поля 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
                )

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018
SELECT key_field
FROM (
    VALUES (1,'a','alex')
                    ,(2,'b','joe')
                    ,(3,'b','alex')
                    ,(4,'c','joe')
                    ,(5,'a','alex')
                    ,(6,'d','cloe')
    ) AS t1(key_field, field1, field2)
WHERE [field1] + ':' + STUFF((
            SELECT DISTINCT ',' + field2
            FROM (
                VALUES (1,'a','alex')
                    ,(2,'b','joe')
                    ,(3,'b','alex')
                    ,(4,'c','joe')
                    ,(5,'a','alex')
                    ,(6,'d','cloe')
                ) AS t2(key_field, field1, field2)
            WHERE t1.field1 = t2.field1
            FOR XML PATH('')
            ), 1, 1, '') LIKE '%,%'

Пояснение:

1-й Я группирую по столбцу field1 и вывожу отдельный набор field2 со значением через запятую

key_field field1 Column2 1 a a: alex 2 б б: Алекс, Джо 3 б б: Алекс, Джо 4 c c: Джо 5 a a: alex 6 д д: cloe

Затем я проверяю, имеют ли какие-либо строки в столбце 2 , , что дает мне окончательный ответ.

т.е.

2,3
0 голосов
/ 05 сентября 2018

Ваш пример данных предлагает мне EXISTS:

select t.*
from table t
where exists (select 1 from table t1 where t1.field1 = t.field1 and t1.field2 <> t.field2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...