запрос для получения адреса электронной почты на основе first_nm и last_nm - PullRequest
0 голосов
/ 27 января 2020

Для каждого email_addr в MEA, он будет проверять соответствующий email_addr в MIS

Input table 1                             
MEA(base)
email_addr
yy@gmail.com
xx@gmail.com
Input table 2
MIS(lookup)
email_addr      first_nm     last_nm
yy@gmail.com     null         null
yy@gmail.com     null         null 
xx@gmail.com     null         null 
xx@gmail.com     xx11         xx22
xx@gmail.com     xx11         null
xx@gmail.com     null         xx22

REQ - Если адрес электронной почты в MEA не связан ни с одним из имен в MIS, он получит адрес электронной почты с нулевым именем и нулевой фамилией.
Если адрес электронной почты в MEA имеет хотя бы одно совпадение в MIS с ненулевым именем / фамилией, исключите любое совпадение для этого адреса электронной почты, где имя и фамилия оба названия имеют значение NULL.

Expected o/p
email_addr       first_nm     last_nm
yy@gmail.com      null         null 
xx@gmail.com      xx11         xx22
xx@gmail.com      xx11         null
xx@gmail.com      null         xx22

3 сценария ios для выбора значения NULL NULL (если это единственная запись) значение NULL значение NULL

пожалуйста, предложите ....

Ответы [ 4 ]

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

Когда нам нужны некоторые данные из таблицы1, которые могут быть связаны - в таблице2 может не быть связанных данных - с таблицей2, я обычно использую LEFT JOIN, для которой мы устанавливаем table1 в качестве левой таблицы и table2 в качестве правой таблицы .
Кроме того, когда мы говорим о запросе через нулевые значения, я обычно думаю об использовании COALESCE(), поэтому я могу предложить вам использовать такой запрос:

select "MEA"."email_addr", "MIS"."first_nm", "MIS"."last_nm"
from "MEA"
left join "MIS"
   on "MEA"."email_addr" = "MIS"."email_addr" 
   and coalesce("MIS"."first_nm", "MIS"."last_nm", '@AllAreNull') != '@AllAreNull' 
order by "MEA"."email_addr", "MIS"."first_nm", "MIS"."last_nm";

SQL Демонстрация Fiddle

Примечание: coalesce() вернет первое ненулевое значение полей слева направо, поэтому я использую значение '@AllAreNull' справа чтобы вернуться, если все null.

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

Попробуйте это:

select * from mis where first_nm is not null or last_nm is not null
union 
select distinct * from mis A where (
(first_nm is null and last_nm is null) or 
not exists(select * from mea B where A.email=B.email)
)
and email not in  
(select distinct email from  mis where first_nm is not null or last_nm is not null);

Вывод

xx@gmail.com    xx11    xx22
xx@gmail.com    xx11    
xx@gmail.com            xx22
yy@gmail.com        
0 голосов
/ 27 января 2020

Вы можете запросить только таблицу MIS, например:

SELECT DISTINCT s.* 
FROM MIS s
WHERE s."first_nm" IS NOT NULL OR s."last_nm" IS NOT NULL
OR NOT EXISTS (
  SELECT 1 FROM MIS
  WHERE "email_addr" = s."email_addr" 
    AND ("first_nm" IS NOT NULL OR "last_nm" IS NOT NULL)
)

Если вы действительно хотите искать только те письма, которые существуют в MEA, тогда вам нужно JOIN:

SELECT DISTINCT s.* 
FROM MEA a INNER JOIN MIS s
ON s."email_addr" = a."email_addr"
WHERE s."first_nm" IS NOT NULL OR s."last_nm" IS NOT NULL
OR NOT EXISTS (
  SELECT 1 FROM MIS
  WHERE "email_addr" = s."email_addr" 
    AND ("first_nm" IS NOT NULL OR "last_nm" IS NOT NULL)
)

См. Демоверсию . Результаты:

> email_addr   | first_nm | last_nm
> :----------- | :------- | :------
> yy@gmail.com | null     | null
> xx@gmail.com | xx11     | xx22   
> xx@gmail.com | null     | xx22     
> xx@gmail.com | xx11     | null  
0 голосов
/ 27 января 2020

Вот первое рабочее решение, но, вероятно, не самое лучшее:

SELECT 
     distinct mis.*
FROM mea
JOIN mis ON mea.email_addr = mis.email_addr
WHERE
     first_nm IS NOT NULL or 
     last_nm IS NOT NULL

UNION

SELECT
     distinct mis.*
FROM mea
JOIN mis ON mea.email_addr = mis.email_addr
WHERE 
     first_nm IS NULL AND 
     last_nm IS NULL AND 
     mea.email_addr NOT IN
     (
          SELECT 
               DISTINCT mea.email_addr
          FROM mea
          JOIN mis ON mea.email_addr = mis.email_addr
          WHERE 
               first_nm IS NOT NULL or 
               last_nm IS NOT NULL
     );

ИЛИ

SELECT 
distinct mis.*
FROM mea
JOIN mis ON mea.email_addr = mis.email_addr
WHERE (first_nm IS NOT NULL or last_nm IS NOT NULL) or
first_nm IS NULL AND last_nm IS NULL AND mea.email_addr NOT IN
(
  SELECT 
  DISTINCT mea.email_addr
  FROM mea
  JOIN mis ON mea.email_addr = mis.email_addr
  WHERE first_nm IS NOT NULL or last_nm IS NOT NULL
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...