昨天碰到了一个这样的问题:在数据库中存在两张同样结构的表:XSB,XSBN。(假设两张表中的字段均为XM,BJ,NL)现在想查询在表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 )