Выберите с не существует в одной таблице с несколькими полями - PullRequest
0 голосов
/ 30 марта 2020

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

ID   VALUE1   VALUE2   VALUE3
1      1         1        1
2      2         2        1
3      3         4        1
4      1         5        1
5      2         2        2
6      3         4        2
7      1         8        2
8      2         2        2

Результат запроса должен быть

ID   VALUE1   VALUE2   VALUE3
1      1         1        1
4      1         5        1

Поскольку остальные значения одинаковы для value1 и value2, но отличаются от value3 , Я имею в виду, что строка 2 таблицы совпадает со строкой 5.

Я пытаюсь сделать что-то вроде, но не работает:

select t1.value1, t1.value2 from table1 t1 where value3=1
and not exist 
(select t2.value1, t2.value2 from table2 t2 
where t1.value1=t2.value1 and t1.value2=t2.value2 and value3=2)

Спасибо за совет и извините за мой английский sh

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Я думаю, not exists делает то, что вы хотите:

select t1.*
from table1 t1
where t1.value3 = 1 and
      not exist (select 1
                 from table2 t2 
                 where t2.value1 = t1.value1 and
                       t2.value2 = t1.value2 and
                       t2.value3 = 2
                );

Тем не менее, вы также можете использовать функции окна:

select t1.*
from (select t1.*,
             max(value3) over (partition by value1, value2) as max_value3
      from table1 t1
      where value3 in (1, 2)
     ) t1
where max_value3 = 1;
1 голос
/ 30 марта 2020

Я думаю, что вы на правильном пути с exists.

Я бы сформулировал ваш запрос следующим образом:

select t1.* 
from table1 t1 
where 
    t1.value3 = 1
    and not exist (
        select 1 from table1 t2 
        where t1.value1 = t2.value1 and t1.value2 = t2.value2 and t2.value3 = 2
    )

Ключевые моменты:

  • подзапрос exists должен быть from table1 (ваш запрос использует table2, но, похоже, эта таблица на самом деле не существует)

  • вам на самом деле не нужно возвращать столбцы из подзапроса exists, поскольку все, что он делает, это проверяет, если создается какая-то строка - следовательно, select 1

1 голос
/ 30 марта 2020

Вы можете использовать NOT EXISTS следующим образом:

SELECT * 
  FROM YOUR_TABLE T1
 WHERE T1.VALUE3 = 1
   AND NOT EXISTS 
       (SELECT 1 
          FROM YOUR_TABLE T2
         WHERE T1.VALUE1 = T2.VALUE1
           AND T1.VALUE2 = T2.VALUE2)
...