与SQL相比,这个公式做了什么

时间:2013-02-03 18:22:12

标签: sql math

A - (B∩A)

我想知道这组数学在查看时可以转化为什么,将它与SQL(运算符)进行比较。

5 个答案:

答案 0 :(得分:3)

如果AB是相同“类型”的表(相应列上的列数和兼容数据类型相同),则可以将其转换为SQL,如下所示:

A EXCEPT (A INTERSECT B) 

当然等同于(在集合和关系代数中):

A EXCEPT B 

如果AB不同“类型”的表格,那么在它们之间设置操作没有意义。 (联合是不同的,他们不应该与联盟,差异或交叉点混淆,无论一个“解释”它们的链接有多受欢迎。)

除了明确(LEFT) JOIN,{{(NOT) IN之外,联合,差异和交叉点也可以用多种方式表达(使用(NOT) EXISTSUNIONEXCEPT组合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

enter image description here

REFERENCE link HERE

另一种选择是使用

SELECT * FROM A 
WHERE 
  NOT EXISTS (SELECT * FROM B WHERE A.Id = B.id)