关于数据库多字段匹配问题

昨天碰到了一个这样的问题:在数据库中存在两张同样结构的表:XSBXSBN。(假设两张表中的字段均为XMBJNL)现在想查询在表XSBN中存在,但表XSB中不存在的记录。

 

这个问题的解决方法有很多

一、              NOT IN

初学者使用最多的就是NOT IN。例如

SELECT * FROM XSBN WHERE XM NOT IN (SELECT XM FROM XSB)


这条语句表示的是XM XSBN中存在但不在XSB表中存在的记录。但是如果要查询XM,BJ同时不匹配的情况怎么办呢?

SELECT * FROM XSBN WHERE (XM,BJ) NOT IN (SELECT XM,BJ FROM XSB)


这样就可以解决了。但是很不幸,有很多数据库并不支持这种格式的NOT IN 语句。我们只能换种办法。

二、使用差集EXCEPT(在Oracle中叫做 MINUS)。

SELECT  *  FROM  XSBN

EXCEPT

SELECT  *  FROM XSB


这个语句的结果是第一个查询的结果集减去第二个查询的结果集(不含重复值)

同理还有并集UNION,交集 INTERSECT.

如果在EXCEPT 后面加上ALL,则最后的结果集包含重复值。

不幸的是,仍然有些数据库不支持EXCEPT,还要换办法。

三、EXISTS

EXISTS表示判断数据是否存在。例如

SELECT ‘TRUE’ FROM XSB WHERE EXISTS (SELECT XM FROM XSB WHERE XH=0001)


表示如果XSB中有学号为‘0001’的学生存在,显示TRUE.

如果我们要查询两个数据库一致的数据可以这样写:

SELECT * FROM XSBN EXISTS (SELECT * FROM XSB WHERE XSB.XH=XSBN.XH AND  XSB.XM=XSBN.XM )


实际上上面的语句就相当于并集操作UNION

那么差集操作如何做呢?只要在EXISTS前面加一个NOT就可以了。即

SELECT * FROM XSBN NOT EXISTS (SELECT * FROM XSB WHERE XSB.XH=XSBN.XH AND  XSB.XM=XSBN.XM )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值