SQL 查找两表中不同的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 查找两表中不同的数据相关的知识,希望对你有一定的参考价值。

设a表
1,2,3
1,2,4
b表
1,2,3
1,2,4
1,2,5
目的找出1,2,5
数据量很大要效率高的语句

使用except函数,select * from B where (select count(1) from A where A.ID = B.ID) = 0.

方法一(推荐)

WITH   C AS ( SELECT   Name

FROM     ConsumerCouponApply A

WHERE    NOT EXISTS ( SELECT 1

FROM   ConsumerCouponApply B

WHERE  B.Name = A.Name

GROUP BY B.Name )

GROUP BY A.Name

)

SELECT  COUNT(1)

FROM    C

方法二

WITH    C AS ( SELECT   A.Name

FROM     ConsumerCouponApply A

GROUP BY A.Name

EXCEPT

SELECT   B.Name

FROM     ConsumerCouponApply B

GROUP BY B.Name

)

SELECT  COUNT(1)

FROM    C

方法三

SELECT  COUNT(A.Name)

FROM    ConsumerCouponApply A

LEFT JOIN ConsumerCouponApply B ON A.Name = B.Name

WHERE   B.ID IS NULL

扩展资料:

高级查询运算词:

A: UNION 运算符:

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个

结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行

不是来自 TABLE1 就是来自 TABLE2。

B: EXCEPT 运算符

EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当

ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

注:使用运算词的几个查询结果行必须是一致的。



参考技术A 方法比较多
我随便举两个例子
假设a表中有一列‘aa’,数据是1,2,3
1,2,4
b表中有一列‘bb’,数据是1,2,3
1,2,4
1,2,5
目的是找出这个1,2,5
其实就是找出唯一值

方法1:写个子查询嵌套
select * from (select a.aa as 'ccc',b.bb as 'bbb'
from a full join b on a.aa = b.bb) c where c.ccc is null or c.bbb is null
这个语句就是找出2张表中的唯一值

方法2:利用union连接再分组having,取得唯一值
select c.aa,count(*) from (select aa from a
union all
select bb from b) c group by c.aa having count(*) = 1
查询出的就是两张表中的唯一值【其实也就是重复次数 = 1的】
参考技术B 给段代码 使用数据库是vs2005自带的sql express。当然 不同的数据库连接字符串不一样 但是GetDataSet(string sql, string tablename)
方法是通用的~参数sql是你sql查询语句 tablename是输出地表明 可以随便添

public static string ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=数据库文件路径;Integrated Security=True;Connect Timeout=30;User Instance=True";
public DataSet GetDataSet(string sql, string tablename)

DataSet ds = new DataSet();
SqlConnection con = new SqlConnection(DataAccess.ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(sql, con);
try

da.Fill(ds, tablename);
if (ds.HasChanges()) da.Update(ds);

catch (Exception ex)

MessageBox.Show("打开数据库表错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);


finally


con.Close();
con.Dispose();
da.Dispose();

return ds;


使用方法 datagridview1.datasource=GetDataSet("select * from student where name="姚明"","table1") //datagridview1当然是你winfrom里的一个datagridview
参考技术C --一句SQL就搞定
SELECT * FROM b
EXCEPT
SELECT * FROM a本回答被提问者采纳

oracle 两表中两列模糊查询,具体例子如下:

A表addr列中有字符串“国强路9号星辰电子”;B表key列中有字符串“星辰电子;公司;厂”。如何将两表用ORACLE语句进行模糊匹配?

创建表插入数据:

create table a
(addr varchar2(100));

insert into a values (\'国强路9号星辰电子\');

create table b
(key varchar2(100));

insert into b values (\'星辰电子;公司;厂\');
commit;

执行:

select a.addr,t.key from a,
(select t1.key,
REGEXP_SUBSTR(t1.key ,\'[^;]+\',1,l)
rolecode
from (
select key from b
) t1,
(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(t1.key) - LENGTH(REPLACE(t1.key,\';\'))+1) t
where instr(a.addr,t.rolecode)>1;

结果:

追问

真的是大神,帮我解决了难题。不过,还想问大神一个简单的问题,
最后一句instr(a.addr,t.rolecode)>1表示匹配上的,那如果想要匹配不上的应该怎么改?

参考技术A 两个表不是没有任何关联的情况下可以用吗

以上是关于SQL 查找两表中不同的数据的主要内容,如果未能解决你的问题,请参考以下文章

sql中有关联的两个表,怎么查出一个表中没有对应到另一个表的数据?

excel中查找两个表格相同数据的方法

sql两表联合查询“根据这两个字段值相同 查找其他字段值”怎么做?

通过在不同的表中查找来更新 SQL 中的记录

Access SQL 查询:查找表中每个不同条目的日期最近的行

如何在sql表中查找缺失的元素