SQL-запрос Найти различия в строках в одной таблице - PullRequest
0 голосов
/ 02 января 2019

предположим, у меня есть следующая таблица:

ID | CMP1 | CMP2 | CMP3 | FK1
------------------------------
1  |   x  |   x  |   x  | 1
2  |   y  |   y  |   y  | 1
3  |   z  |   z  |   z  | 1
------------------------------
4  |   a  |   a  |   a  | 2
5  |   a  |   a  |   a  | 2
6  |   c  |   c  |   c  | 2
------------------------------
7  |   s  |   u  |   v  | 3
8  |   s  |   u  |   i  | 3
9  |   s  |   u  |   z  | 3

Теперь мне нужно написать запрос, который возвращает все идентификаторы, на которые ссылается FK1, но которые имеют разные значения в CMP1-3.

Пример:

  • Для идентификатора 1-3 запрос должен возвращать 1,2,3.
  • Для идентификатора 4-6 запрос должен возвращать 6.
  • Для идентификатора 7-9 запрос должен возвращать 7,8,9.

Iзнаю, что мне нужно самостоятельно присоединиться к таблице, но я не могу сравнить значения, сгруппированные по FK1 - помогите, пожалуйста!

Спасибо

1 Ответ

0 голосов
/ 02 января 2019

Кажется, вам нужны строки, в которых значение (cmp1, cmp2, ​​cmp3, fk1) является уникальным.Вы можете использовать оконные функции:

select t.*
from (select t.*,
             count(*) over (partition by cmp1, cmp2, cmp3, fk1) as cnt
      from t
     ) t
where cnt = 1;

Альтернативный метод использует not exists:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.fk1 = t.fk1 and
                        t2.cmp1 = t.cmp1 and
                        t2.cmp2 = t.cmp2 and
                        t2.cmp3 = t.cmp3 and
                        t2.id <> t.id
                 );

То есть не существует другой строки с такой же комбинацией (fk1, cmp1, cmp2, cmp3) - иразные id.

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