Извлечение данных на основе 2 таблиц, в которых запись не соответствует 1 или нескольким полям - PullRequest
1 голос
/ 01 июля 2019

Я сейчас пытаюсь извлечь данные из 2 разных таблиц, которые не соответствуют одной и той же записи в 1 или нескольких полях

TABLE 1
----------------------------------
ID          NAME            MEMBER          SMS_MEMBER
1           JOHN            YES             NO
2           JOY             'NO'            NO
3           SMITH           NO              'YES'
4           ANDRES          YES             YES
5           JIMMY           NO              YES


TABLE 2
----------------------------------
ID          NAME            MEMBER          SMS_MEMBER
1           JOHN            YES             NO
2           JOY             'YES'           NO
3           SMITH           NO             'NO'
4           ANDRES          YES             YES
5           JIMMY           NO              YES

Вот мой логический запрос

SELECT * FROM TABLE1
WHERE 
TABLE1.ID NOT IN TABLE2.ID 
OR
TABLE1.NAME NOT IN TABLE2.NAME 
OR
TABLE1.EMAIL_MEMBER NOT IN TABLE2.EMAIL_MEMBER
OR
TABLE1.SMS_MEMBER NOT IN TABLE2.SMS_MEMBER;

Извлеченная запись будет

----------------------------------
ID          NAME            MEMBER          SMS_MEMBER
2           JOY             'NO'            NO
3           SMITH           NO              'YES'

Поскольку приведенная ниже запись соответствует, она будет исключена из окончательного извлечения после запроса

ИСКЛЮЧЕННАЯ ЗАПИСЬ

ID          NAME            MEMBER          SMS_MEMBER
1           JOHN            YES             NO
4           ANDRES          YES             YES
5           JIMMY           NO              YES

Было бы здорово, если бы вы, ребята, тоже помогли мне, пожалуйста.

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Один простой метод использует агрегацию. Предполагая, что в любой таблице нет дубликатов:

select id, name, member, sms_member
from ((select id, name, member, sms_member
       from table1
      ) union all
      (select id, name, member, sms_member
       from table2
      )
     ) t
group by id, name, member, sms_member
having count(*) = 1;

Тем не менее, ваши примерные данные предполагают, что вы просто хотите строки в table2, которых нет в table1. Если это так, я рекомендую not exists:

select t2.*
from table2 t2
where not exists (select 1
                  from table1 t1
                  where t1.id = t2.id and t1.name = t2.name and t1.member = t2.member an t1.sms_member = t2.sms_member
                 );

Логика должна быть настроена, если значения NULL возможны в любых столбцах.

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

Вам необходимо left join:

select t1.*
from table1 t1 left join table2 t2
on t2.id = t1.id and t2.name = t1.name and t2.email_member = t1.email_member and t2.sms_member = t1.sms_member
where t2.id is null

Соответствующие записи будут исключены, поскольку для них t2.id не равно null.Смотрите демо .Результаты:

| id  | name  | email_member | sms_member |
| --- | ----- | ------------ | ---------- |
| 2   | JOY   | NO           | NO         |
| 3   | SMITH | NO           | YES        |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...