A - (B∩A)
我想知道这组数学在查看时可以转化为什么,将它与SQL(运算符)进行比较。
答案 0 :(得分:3)
如果A
和B
是相同“类型”的表(相应列上的列数和兼容数据类型相同),则可以将其转换为SQL,如下所示:
A EXCEPT (A INTERSECT B)
当然等同于(在集合和关系代数中):
A EXCEPT B
如果A
和B
是不同“类型”的表格,那么在它们之间设置操作没有意义。 (联合是不同的,他们不应该与联盟,差异或交叉点混淆,无论一个“解释”它们的链接有多受欢迎。)
除了明确(LEFT) JOIN
,{{(NOT) IN
之外,联合,差异和交叉点也可以用多种方式表达(使用(NOT) EXISTS
,UNION
,EXCEPT
组合1}}和INTERSECT
运算符)不会改变它。
语法与上面不完全相同。可以使用任何一个(在Postgres和SQL-Server中工作。如果用EXCEPT
替换MINUS
,它也适用于Oracle):
SELECT *
FROM a
EXCEPT
( SELECT *
FROM a
INTERSECT
SELECT *
FROM b
) ;
或者这个(适用于Postgres 8.4及以上版本: SQL-Fiddle test )
SELECT *
FROM
( TABLE a
EXCEPT
( TABLE a INTERSECT TABLE b )
) t ;
甚至这个(看马,没有SELECT
!):
TABLE a
EXCEPT
( TABLE a INTERSECT TABLE b ) ;
答案 1 :(得分:3)
就SQL提供另一种选择:
SELECT id FROM A
MINUS
SELECT id FROM B
<强> UPD:强>
请注意MINUS
从最终结果集中删除重复项,并且只存在于Oracle中。
SQL标准使用其他供应商支持的EXCEPT:
SELECT id FROM A
EXCEPT
SELECT id FROM B
在标准中,它有DISTINCT
选项,可以删除欺骗。我想你必须检查特定供应商的文档,看看是否会删除重复项。例如,SQL Server的EXCEPT
实现与Oracle中的MINUS
相同。
答案 2 :(得分:2)
这计算A和B的设定差异,并且垫子也与A - B
相等。所以你在这里感兴趣的是A中不在B中的元素。
您可以查看this blog post,了解如何在mysql中完成设置差异。
答案 3 :(得分:0)
那将是SET A MINUS(SET A INNER JOIN SET B)。您正在记录A和B中的记录(INNER JOIN),然后从SET A(MINUS)中删除
集合论中的交叉与SQL术语中的INNER JOIN等效。
编辑:关于与NOT IN相同的问题,不是真的。 NOT IN是用于列值的运算符('selection')。 MINUS,JOIN等设置运算符以在行集之间执行操作。
答案 4 :(得分:0)
A – ( B ∩ A )
等效于A LEFT OUTER JOIN B WHERE TableB.id IS null
另一种选择是使用
SELECT * FROM A
WHERE
NOT EXISTS (SELECT * FROM B WHERE A.Id = B.id)