SQL - найти записи из одной таблицы, которые существуют в другой, и удалить, если нет - PullRequest
0 голосов
/ 24 января 2020

У меня есть следующие четыре SQL таблицы:

Table 1:
-----------------------
Product | Date_Purchase
-----------------------
abc     | 06-Jan-19
def     | 05-Jan-18
ghi     | 05-Apr-19
abc     | 06-Feb-19

Table 2:

------------------------
Product | Date_Purchase
------------------------
jkl    | 6-Feb-19
mno    | 2-Aug-18
ghi    | 9-May-19
pqr    | 1-Sep-19

Table 3:

-------------------------
Product | Date_Purchase
-------------------------
ghi    | 2-Aug-18
mno    | 9-May-19
pqr    | 2-Aug-18
abc    | 06-Jan-19

Table 4:

-------------------------
Product | Date_Purchase
-------------------------
stu    | 9-May-19
vwx    | 05-Apr-19
ghi    | 9-May-19
def    | 05-Jan-18

У меня есть следующий код, который объединяет таблицы с Union:

SELECT Product, Date_Purchase FROM Table1 UNION ALL
SELECT Product, Date_Purchase FROM Table2 UNION ALL
SELECT Product, Date_Purchase FROM Table3 UNION ALL SELECT Product, Date_Purchase FROM Table4
ORDER BY Product, Date_Purchase;

Я хотел бы удалить все строки из таблиц, независимо от таблицы, которые появляются только один раз во всех таблицах.

Например, jkl, stu и vwx появляются только один раз, поэтому я хотел бы удалить все строки из таблица, где они появляются. У кого-нибудь есть идеи, как это сделать? Кроме того, как я могу удалить все продукты, которые отображаются в таблицах и имеют одинаковую дату покупки?

Ответы [ 3 ]

0 голосов
/ 25 января 2020

Решение для MySql, с помощью которого в 1 утверждении вы можете удалить из всех 4 таблиц:

delete t1, t2, t3, t4
from (
  select u.product, count(*) counter 
  from (
    select * from table1 union all
    select * from table2 union all
    select * from table3 union all
    select * from table4
  ) u  
  group by u.product
) t 
left join table1 t1 on t1.product = t.product
left join table2 t2 on t2.product = t.product
left join table3 t3 on t3.product = t.product
left join table4 t4 on t4.product = t.product
where t.counter = 1; 

См. demo . Результаты: Таблица 1

> Product | Date_Purchase
> :------ | :------------
> abc     | 06-Jan-19    
> def     | 05-Jan-18    
> ghi     | 05-Apr-19    
> abc     | 06-Feb-19  

Таблица2

> Product | Date_Purchase
> :------ | :------------
> mno     | 2-Aug-18     
> ghi     | 9-May-19     
> pqr     | 1-Sep-19 

Таблица3

> Product | Date_Purchase
> :------ | :------------
> ghi     | 2-Aug-18     
> mno     | 9-May-19     
> pqr     | 2-Aug-18     
> abc     | 06-Jan-19 

Table4

> Product | Date_Purchase
> :------ | :------------
> ghi     | 9-May-19     
> def     | 05-Jan-18 
0 голосов
/ 26 января 2020

Попробовать версию Scratte только в том случае, если продукт и Дата встречаются дважды (не отмечены, поскольку написаны на мобильном устройстве):

SELECT pdo.*
FROM (SELECT pd.*, COUNT(*) OVER (PARTITION BY Product) as cnt
      FROM ((SELECT Product, Date_Purchase FROM Table1
            ) UNION ALL
            (SELECT Product, Date_Purchase FROM Table2
            ) UNION ALL
            (SELECT Product, Date_Purchase FROM Table3
            ) UNION ALL
            (SELECT Product, Date_Purchase FROM Table4
            )
           ) pd
     ) pdo
Group by pdo.Product,pdo.Date_Purchase
Having cnt=1
0 голосов
/ 25 января 2020

Если «удалить» означает не возвращать, вернуть их в select, тогда:

SELECT pd.*
FROM (SELECT pd.*, COUNT(*) OVER (PARTITION BY Product) as cnt
      FROM ((SELECT Product, Date_Purchase FROM Table1
            ) UNION ALL
            (SELECT Product, Date_Purchase FROM Table2
            ) UNION ALL
            (SELECT Product, Date_Purchase FROM Table3
            ) UNION ALL
            (SELECT Product, Date_Purchase FROM Table4
            )
           ) pd
     ) pd
WHERE cnt = 1;

Если «удалить» означает, delete, то вам нужно четыре delete утверждения, каждое подобное this:

delete t
   from table1 t
   where not exists (select 1 from table2 where t2.product = t.product) and
         not exists (select 1 from table3 where t3.product = t.product) and
         not exists (select 1 from table4 where t4.product = t.product);

На самом деле, это удаляет продукты, которые есть только в таблице, даже если они присутствуют несколько раз. Его можно настроить только для удаления синглетонов, если это также необходимо.

...