Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据记录在1个或多个字段上不匹配的2个表提取数据_Mysql_Sql - Fatal编程技术网

Mysql 根据记录在1个或多个字段上不匹配的2个表提取数据

Mysql 根据记录在1个或多个字段上不匹配的2个表提取数据,mysql,sql,Mysql,Sql,我现在正在尝试从两个不同的表中提取数据,这些表在1个或多个字段中与同一条记录不匹配 TABLE 1 ---------------------------------- ID NAME MEMBER SMS_MEMBER 1 JOHN YES NO 2 JOY 'NO' NO 3 SMIT

我现在正在尝试从两个不同的表中提取数据,这些表在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'
因为下面的记录是匹配的,所以在查询之后,它将从最终摘录中排除

排除记录
如果你们也能在这方面帮助我,那就太好了。

一个简单的方法就是使用聚合。假设两个表中没有重复项:

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;
但是,示例数据表明,您只需要
表2中不在
表1中的行。如果是,我建议
不存在

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
值,则需要调整逻辑。

您需要
左连接:

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

请参阅。
结果:


没有空值,所有值都有true或false,但我有两个表,所以我想匹配值已更改的位置
TABLE1.ID不在TABLE2.ID
将排除所有行。@Cid有一个or,它排除所有名称和另一个,或排除所有成员和另一个,或排除所有sms_成员。啊,是的,没有联接,这不是逐条记录
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
| id  | name  | email_member | sms_member |
| --- | ----- | ------------ | ---------- |
| 2   | JOY   | NO           | NO         |
| 3   | SMITH | NO           | YES        |