2015-04-14 23 views
1

我有一个查询匹配两个表之间的6个字段并返回匹配。该查询使用内部连接。我一直在测试INTERSECT来取代这个。因此,INTERSECT的结果的其他字段

SELECT Field1, Field2, Field3,...,Field6 
FROM TableA 
INTERSECT 
SELECT Field1, Field2, Field3,...,Field6 
FROM TableB 

不过,我想TableA.ID和TableB.ID添加到结果并不能完全把它写在查询永远不会采取(相对于原来的查询)。有什么想法吗?

更新: 遗憾的是,当第一个问题是如何正确编写查询时,我添加了关于性能的评论。正如你所看到的,我认为主要的问题是我不能改进的非常糟糕和不正确的查询结构。我尝试:

SELECT a.ID, b.ID  
FROM TableA a 
INNER JOIN 
(
    SELECT Field1, Field2, Field3,...,Field6 
    FROM TableA 
    INTERSECT 
    SELECT Field1, Field2, Field3,...,Field6 
    FROM TableB 
) Dupes ON 
(
    a.Field1 = Dupes.Field1 and 
    ... 
    a.Field6 = Dupes.Field6 
) 
INNER JOIN TableB b 
(
    b.Field1 = Dupes.Field1 and 
    ... 
    b.Field6 = Dupes.Field6 
) 
+0

你对这两张桌子有什么样的索引?我猜ID是主键?执行计划在永久需要时显示什么? –

+0

这些ID是主键,它们是当前表上唯一的索引。我可以告诉我当前的尝试是不正确的(返回的行太多),因此我首先查找正确的查询。我试图破译执行计划,但我不是那里的专家。 – user2178080

+1

您能否显示您正在执行的确切的SQL需要这么长时间? –

回答

2

上的所有6个领域的简单INNER JOIN将有共同的字段值两个表返回所有记录:

SELECT A.ID, B.ID, A.Field1, A.Field2, A.Field3, A.Field4, 
     A.Field5, A.Field6 
FROM TableA AS A 
INNER JOIN TableB AS B 
ON A.Field1 = B.Field1 AND A.Field2 = B.Field2 AND A.Field3 = B.Field3 AND 
    A.Field4 = B.Field4 AND A.Field5 = B.Field5 AND A.Field6 = B.Field6 

要优化你需要设置使用的所有列的索引上查询在INNER JOINON条款中。

相关问题