在sql查询中交叉操作的问题

时间:2010-06-02 18:42:50

标签: sql intersection

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

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

有人可以帮帮我吗?

非常感谢。

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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 */
 )

答案 1 :(得分: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 

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

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

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

与联合工作所需的标准不匹配。“WHERE”子句正在创建问题。

如果results.a<> results.c:比你...没有任何东西可以交叉。