Объедините эти два оператора SQL в один - PullRequest
0 голосов
/ 26 октября 2019

У меня есть две таблицы t1, t2 со столбцами name, invoice, total.

Я использую этот запрос для получения строк, которые в T2, а не в T1

select * 
from t2  
where name = (select source from info) 
except 
(select * from t1)

Он работает нормально и возвращает пару строк, я хочу удалить эти возвращенные строки в одном выражении.

Я пробовал это, но он удаляет все строки в T2, а не только возвращенные строки из запроса.

delete from t2 
where exists ((select * 
               from t2  
               where name = (select source from info) 
               except 
               (select * from t1) 
             )) 

Вот пример моих данных:

T1

enter image description here

T2

enter image description here

ВОЗВРАЩЕННЫЕ ДАННЫЕ (СУЩЕСТВУЕТ В T2, А НЕ В T1, ГДЕ ИМЯ С2)

enter image description here

3-я информация таблицы - это имя, которое в данном случае - C2.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 26 октября 2019

Вы можете сделать это с помощью левого соединения от t2 до t1:

delete t
from (
  select * from t2
  where name = (select source from info)
) t left join t1
on t1.name = t.name and t1.invoice = t.invoice and t1.total = t.total
where t1.name is null

См. Демоверсию . Если вы хотите использовать NOT EXISTS:

delete t
from (
  select * from t2
  where name = (select source from info)
) t 
where not exists (
  select 1 from t1
  where name = t.name and invoice = t.invoice and total = t.total
)

См. demo . Результаты (оставшиеся строки в t2):

> name | invoice | total
> :--- | ------: | ----:
> C1   |       1 |   150
> C1   |       2 |   300
> C2   |       1 |   200
> C2   |       2 |   165
1 голос
/ 26 октября 2019

Вы хотите удалить из t2 с двумя условиями:

  • name = (выберите источник из информации)
  • строка не соответствует в t1

Оператор:

delete from t2
where name = (select source from info)
and not exists
(
  select *
  from t1
  where t1.name = t2.name
    and t1.invoice = t2.invoice
    and t1.total = t2.total
);

Или короче с предложением IN, доступно только в СУБД, которые допускают IN с кортежами:

delete from t2
where name = (select source from info)
and (name, invoice, total) not in (select name, invoice, total from t1);
1 голос
/ 26 октября 2019

Я использую этот запрос, чтобы получить строки, которые в T2, а не в T1

Запрос, который я бы использовал:

select t2.*
from t2
where not exists (select 1 from t1 where t1.? = t2.name);

Этонепонятно, как называется соответствующий столбец в t1.

Это легко превращается в delete:

delete from t2
where not exists (select 1 from t1 where t1.? = t2.name);
...