我写了下面的查询,我认为这是正确的,但我有一个“缺少操作符”错误。SQL查询中相交操作的问题
SELECT * FROM results,Types WHERE results.a=Types.b
INTERSECT SELECT * FROM results,Types WHERE results.c=Types.b
请问有人能帮助我吗?
非常感谢。
我写了下面的查询,我认为这是正确的,但我有一个“缺少操作符”错误。SQL查询中相交操作的问题
SELECT * FROM results,Types WHERE results.a=Types.b
INTERSECT SELECT * FROM results,Types WHERE results.c=Types.b
请问有人能帮助我吗?
非常感谢。
您使用的数据库是?你确定支持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 */
)
这是可能的非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
语句。确保他们自己工作。然后执行INTERSECT
。
例如,如果您正在使用SQL Server,那么不是引用两个表的正确方法。您需要添加一个JOIN
子句(将ON
指定为JOIN
的列)。
即使它不是SQL Server,也需要确保这些查询各自独立运行。
编辑:其他人在这里询问How can I implement SQL INTERSECT and MINUS operations in MS Access。我在那里看到意见分歧,所以一定要测试你的结果,以确保你得到你想要的。
“SELECT”单独运行良好,但即使使用“JOIN”,它们也不会一起工作。 – Shadi 2010-06-02 19:09:45
只有当你想查找单个查询产生公共行时,才使用INTERSECT语句。 你声明:
“SELECT * FROM结果,哪些类型的results.a = Types.b
INTERSECT SELECT * FROM结果,哪些类型的results.c = Types.b”
不符合联合工作所需的标准。“WHERE”条款正在产生问题。
如果results.a <> results.c:比你...没有什么INTERSECT。
请问什么数据库引擎和版本?我无法在SQL Server 2005 SP3上重现 – gbn 2010-06-02 19:10:51
我很确定MSAccess不支持INTERSECT。您需要加入所有专栏。你能指出由'*'返回的列列表和哪些列允许为NULL吗? – 2010-06-02 19:12:32