2010-06-02 32 views
0

我写了下面的查询,我认为这是正确的,但我有一个“缺少操作符”错误。SQL查询中相交操作的问题

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

请问有人能帮助我吗?

非常感谢。

+1

请问什么数据库引擎和版本?我无法在SQL Server 2005 SP3上重现 – gbn 2010-06-02 19:10:51

+0

我很确定MSAccess不支持INTERSECT。您需要加入所有专栏。你能指出由'*'返回的列列表和哪些列允许为NULL吗? – 2010-06-02 19:12:32

回答

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

我使用MSAccess。我不确定,现在我会检查。 – Shadi 2010-06-02 19:10:07

+0

你是对的。它不支持INTERSECTION。那么,如果我想交叉他们,我该怎么办? – Shadi 2010-06-02 19:13:08

+0

@Shadi - 是的,不幸的是路口不可用。这意味着你将不得不艰难地完成任务,参见上面的EDIT2。我还没有测试过,但我认为这个想法应该有希望奏效。 – dcp 2010-06-02 19:36:25

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 
+1

即使它们不是令人困惑的事情,隐式连接也是一种非常糟糕的技术,它们应该被替换。当然,查询不应该使用select *! – HLGEM 2010-06-02 18:54:28

+1

@HLGEM:一次只能做一件事:-) – gbn 2010-06-02 18:56:38

+0

它在JOIN中也不起作用。 SELECT查询单独工作,但不在一起。 – Shadi 2010-06-02 19:08:50

2

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

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

即使它不是SQL Server,也需要确保这些查询各自独立运行。

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

+0

“SELECT”单独运行良好,但即使使用“JOIN”,它们也不会一起工作。 – Shadi 2010-06-02 19:09:45

0

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

“SELECT * FROM结果,哪些类型的results.a = Types.b
INTERSECT SELECT * FROM结果,哪些类型的results.c = Types.b”

不符合联合工作所需的标准。“WHERE”条款正在产生问题。

如果results.a <> results.c:比你...没有什么INTERSECT。