Таблица трех объединений без дубликатов минус одна таблица в Mysql - PullRequest
0 голосов
/ 09 июля 2019

Таблица: 2018

No  Email

1   Lilly@gmail.com

2   brens@gmail.com

3   susan@gmail.com

4   resh@gmail.com

Таблица: 2017

No   Email

1    chitta@gmail.com

2    resh@gmail.com

3    brens@gmail.com

4    minu@gmail.com

Таблица: 2016

No   Email

1     brens@gmail.com

2     chitta@gmail.com

3     lisa@gmail.com

4     monay@gmail.com

5     many@gmail.com

Таблица: 2019

No   Email

1    brens@gmail.com

2    chitta@gmail.com

3    rinu@gmail.com

4    emma@gmail.com

Мне нужно выполнить объединение таблиц 2018,2017,2016 без дубликатов электронных писем, за исключением таблицы 2019. Результат должен выглядеть следующим образом:

РЕЗУЛЬТАТ

No  Email

1    Lilly@gmail.com

2    susan@gmail.com

3    resh@gmail.com

4    minu@gmail.com

5   lisa@gmail.com

6   monay@gmail.com

7   many@gmail.com

Операция минус недоступна в Mysql.

select a.*from(select *from y2018 union select *from y2017 where not exists(select *from y2018 where y2018.email=y2017.email ) union select *from y2016 where not exists(select *from y2018 where y2018.email=y2016.email ))a LEFT OUTER JOIN y2019 b on a.email=b.email  where b.email is null ;

Это дает результат, но не устраняет дубликаты в (2017 Union 2016)

кто-то, пожалуйста, помогите мне

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я нахожу лучший способ, создавая представление и сохраняя в нем часть запроса.Это также помогает сократить время обработки.

create view vm as select *from y2018 union select *from y2017 where not exists(select *from y2018 where y2018.email=y2017.email);

SELECT  a.*FROM(SELECT * FROM vm union select *from y2016 where not exists(select *from vm where vm.email=y2016.email))a LEFT JOIN y2019 b ON a.email=b.email where b.email is null;

Здесь 'vm' - это представление

0 голосов
/ 09 июля 2019

Мне нужно выполнить объединение таблиц 2018,2017,2016 без дубликатов. электронные письма минус таблица 2019

Самым простым для моделирования / эмуляции минус / ожидания является использование NOT IN()

Запрос

SELECT 
   (@ROW_NUMBER := @ROW_NUMBER + 1) AS 'No' 
 , unique_email.Email
FROM (

  SELECT 
    DISTINCT 
      years_merged.Email  
  FROM (

    SELECT 
     Email
    FROM 
     y2019
    UNION ALL
    SELECT 
     Email
    FROM 
     y2018
    UNION ALL
    SELECT 
     Email
    FROM
     y2017   
    UNION ALL
    SELECT 
     Email
    FROM 
     y2016     

  ) AS years_merged
  WHERE 
   years_merged.Email NOT IN(SELECT y2019.Email FROM y2019 ) 
  ORDER BY
   years_merged.Email ASC
) AS unique_email
CROSS JOIN (SELECT @ROW_NUMBER := 0) AS init
ORDER BY 
  @ROW_NUMBER ASC

Результат

| No  | Email           |
| --- | --------------- |
| 1   | Lilly@gmail.com |
| 2   | lisa@gmail.com  |
| 3   | many@gmail.com  |
| 4   | minu@gmail.com  |
| 5   | monay@gmail.com |
| 6   | resh@gmail.com  |
| 7   | susan@gmail.com |

Да, порядок другой, но это лучшее, что вы можете сделать, поскольку стандарты SQL определяют таблицы SQL для сортировки по порядку.

см. демо

Но симуляция / эмуляция минус / ожидание с использованием ... LEFT JOIN ... ON ... WHERE .. IS NULL может оптимизировать лучше, чем NOT IN()

См. демо

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