sql查询中的相交操作问题

Posted

技术标签:

【中文标题】sql查询中的相交操作问题【英文标题】:problem with intersect operation in a sql query 【发布时间】:2010-06-02 18:42:49 【问题描述】:

我写了以下查询,我认为它是正确的,但是我有一个“缺少运算符”的错误。

SELECT * FROM results,Types WHERE results.a=Types.b  
INTERSECT  SELECT * FROM results,Types WHERE results.c=Types.b

有人可以帮帮我吗?

非常感谢。

【问题讨论】:

请问什么数据库引擎和版本?我无法在 SQL Server 2005 SP3 上重现 我很确定 MSAccess 不支持 INTERSECT。您将需要加入所有列。能否指出*返回的列列表,哪些列允许为NULL? 请分享更多细节,以便其他人可以重现您的问题 【参考方案1】:

您使用的是什么数据库?你确定支持intersect 吗?我在 Oracle 上尝试了您的查询(将表名更改为与我的数据库相对应的名称),它工作正常。

编辑: 既然您确认您正在使用 MS-Access,那么很明显 INTERSECT 是问题,因为 MS-Access 不支持它:http://www.access-programmers.co.uk/forums/archive/index.php/t-86531.html

编辑2: 这是未经测试的,但基本思想是您需要查找第一个查询中存在于第二个查询中的所有行。为此,您必须比较两个查询之间的每一列是否匹配,因为所有列都必须匹配才能成为“相交”行。

可能存在一些语法问题,但希望这可以帮助您入门。

SELECT r.col1
     , t.col1
     /* list all other columns here */
  FROM results r
     , types t
 WHERE r.a = t.b
 AND EXISTS (
     SELECT *
       FROM results r2
          , types   t2
      WHERE r2.c = t2.b
        AND NZ(r.col1,0) = NZ(r2.col1,0)
        AND NZ(t.col1,0) = NZ(t2.col1,0)
        /* list other columns here, they all need to match so intersection will work */
 )

【讨论】:

我使用 MSAccess。我不确定,我现在会检查。 你是对的。它不支持 INTERSECTION。那么,如果我想与它们相交应该怎么做呢? @Shadi - 是的,很遗憾没有交叉路口。这意味着您必须以艰难的方式做事,请参见上面的 EDIT2。我还没有测试过,但我认为这个想法应该会奏效。 INTERSECT 将 NULL 视为相等以进行比较,以便重现需要加载 IFNULL 或任何 Access 语法。 @Martin Smith - 感谢您的评论。我更新了我的答案以反映这一点。似乎 NZ 相当于 ACCESS 中的 IFNULL。【参考方案2】:

非 ANSI 连接可能会造成混淆

SELECT * FROM results R JOIN Types T ON R.a = T.b  
INTERSECT
SELECT * FROM results R JOIN Types T ON R.c = T.b 

【讨论】:

即使它们不会混淆问题,隐式连接也是一种非常糟糕的技术,应该替换它们。当然查询也不应该使用 select *! @HLGEM:一次一件事 :-) 它也不适用于 JOIN。 SELECT 查询单独工作,但不能一起工作。【参考方案3】:

我建议分别测试每个SELECT 语句。确保他们自己工作。然后执行INTERSECT

例如,如果您使用的是 SQL Server,那么这不是引用两个表的正确方法。您需要添加一个JOIN 子句(使用ON 指定JOIN 的列)。

即使不是 SQL Server,您也需要确保每个查询都能独立运行。

编辑:有人在这里问过How can I implement SQL INTERSECT and MINUS operations in MS Access。我看到了意见分歧,所以一定要测试你的结果,以确保你得到你想要的。

【讨论】:

“SELECT”单独工作很好,但即使与“JOIN”一起工作也不能。【参考方案4】:

仅当您想查找单个查询产生的公共行时才使用 INTERSECT 语句。 你的声明:

" SELECT * FROM results,Types WHERE results.a=Types.b INTERSECT SELECT * FROM results,Types WHERE results.c=Types.b "

不符合关节工作所需的标准。“WHERE”子句造成了问题。

如果 results.aresults.c :than u... 没有要相交的东西。

【讨论】:

以上是关于sql查询中的相交操作问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句的MINUS,INTERSECT和UNION ALL

SQL查询以查找ID不在另一个表中的记录

使用 FROM 子句中的子查询进行联接操作中的 SQL 语法错误

sql模糊查询

excel中的sql查询

SQL Server 中的 SQL 查询优化