sql 查询取差集,需要根据两个字段来确定行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 查询取差集,需要根据两个字段来确定行相关的知识,希望对你有一定的参考价值。

例如:表a
a b ...
1 2
1 3
2 1
2 2
2 3
表b
a b ...
1 3
2 1
2 3
差集应该得到结果
a b
1 2
2 2

你给的例子太特殊了,可以看成是不同的数字的差,也可以看成是求和后的差。
第一种,同意1楼,用EXCEPT最简洁了
SELECT a, b from a except select a, b from b

第二种按照和来算
SELECT t1.a, SUM(t1.b) - SUM(t2.b)
FROM a t1
LEFT JOIN b t2
ON t1.a = t2. a
GROUP BY t1.a

最好可以对sum(t2.b)做一个null判断,oracle里面就是
SELECT t1.a, NVL(SUM(t1.b), 0) - NVL(SUM(t2.b), 0)
FROM a t1
LEFT JOIN b t2
ON t1.a = t2. a
GROUP BY t1.a

其他sql方言要对null判断作适当转换,类似
SELECT t1.a,
CASE WHEN SUM(t1.b) IS NULL THEN 0 ELSE SUM(t1.b) END
- CASE WHEN SUM(t2.b) IS NULL THEN 0 ELSE SUM(t2.b) END -
FROM a t1
LEFT JOIN b t2
ON t1.a = t2. a
GROUP BY t1.a
参考技术A SELECT [表A].*
FROM [表A]
WHERE NOT EXISTS
(SELECT * FROM [表B] WHERE [表A].[A] = [表B].[A] AND [表A].[B] = [表B].[B])本回答被提问者和网友采纳
参考技术B select * from 表a where 表a.a+表a.b not in (select 表b.a+表b.b from 表b) 参考技术C 用 SELECT …… EXCEPT SELECT…… 呗
返回左边有的右边没有的

SQL操作结果——并集差集交集

针对sql操作结果,经常面临对数据取并集、差集和交集的问题,如何能更高效更快速的对数据进行操作呢?

首先需要有两个表, 这两个表需要有相同的筛选字段列,以下详解。。。

为以下展示操作,建两个数据表:

test1:

test2:

一 并集Union

Union可以对两个或多个结果集进行连接, 形成“并集”。

限定条件:

1 子结果集要具有相同的结构

2 子结果集的列数必须相同

3 子结果集对应的数据类型必须可以兼容

4 每个子结果集不能包含order by和compute子句

语法格式

[SQL语句 1]
UNION
[SQL语句 2];

查询结果:

UNION和UNION ALL是有区别的,也就是说UNION ALL在执行后,不会把相同的结果合并,而UNION会把相同的结果只显示成一行。

 

二 差集 Except

Except可以对两个或多个结果集进行连接,形成“差集”。返回左边结果集合中已经有的记录,而右边结果集中没有的记录。

限定条件:

1 子结果集要具有相同的结构

2 子结果集的列数必须相同

3 子结果集对应的数据类型必须可以兼容

4 每个子结果集不能包含order by和compute子句

语法格式

[SQL语句 1]
Except
[SQL语句 2];

 

三 交集InterSect

InterSect可以对两个或多个结果集进行连接,形成“交集”。返回左边结果集和右边结果集中都有的记录。

限定条件

1 子结果集要具有相同的结构

2 子结果集的列数必须相同

3 子结果集对应的数据类型必须可以兼容

4 每个子结果集不能包含order by和compute子句

语法格式

[SQL语句 1]
InterSect
[SQL语句 2];

 

呃呃呃,对于以上语法,是适用于Oracle的,小编使用的是mysql,需要取交集,此时的InterSect对于mysql 来说是不识别的,所以小编另寻他法。

针对mysql取交集,可以使用inner join语法。

SELECT 列名
FROM 表1 INNER JOIN 表2
USING(列名);

或者

SELECT 表1.列名
FROM 表1 INNER JOIN 表2
on 表1.列名=表2.列名

 

 

以上是关于sql 查询取差集,需要根据两个字段来确定行的主要内容,如果未能解决你的问题,请参考以下文章

SQL操作结果——并集差集交集

两个list求差集

sql server 交集,差集的用法 (集合运算)

Java8===两个List集合取交集并集差集

Java8===两个List集合取交集并集差集

sql 根据字段取最小的一条值