2013-01-31 154 views
1

我有两个表,我试图通过一个字段进行联接,并且它在两个查询中给出了不同的结果,这些结果应该会给出相同的结果。查询是:具有不同结果的SQL查询

SELECT * FROM tblCustomer tca 
WHERE tca.PhoneNumber IN(
    SELECT ts.SubscriptionNumber FROM sub.tblSubscription ts 
    WHERE ts.ServiceTypeID=4 
    AND ts.SourceID=-1 
) 

SELECT tca.* 
FROM sub.tblSubscription ts 
     inner JOIN tblCustomer tca 
      ON ts.SubscriptionNumber = tca.PhoneNumber 
WHERE ts.ServiceTypeID = 4 
     AND ts.SourceID = -1 

这怎么可能?

+0

有什么区别?关系是一对一还是另一个? –

+0

你能告诉我们数据和表格定义吗? – SQLGuru

+1

'IN'是一个半连接,由于'1..n'关系不会带来重复。它比内部加入更有效,然后用'DISTINCT'删除重复项。 –

回答

3

我假设客户可以有多个订阅,对不对?我们假设您有5个客户,每个客户有2个订阅...

当执行SELECT ... FROM Customer WHERE IN(订阅)时,您将收到5个客户记录,因为这5个客户中的每一个实际上都在订阅表,即使订阅表将有10条记录。您本质上要求数据库从一个表中获取数据,其中一个字段的值存在于另一个表中。所以它只会返回FROM表中的不同记录,而不管WHERE IN表中的数据量。

另一方面,INNER JOIN的客户表与订阅表将返回5客户x 2订阅每个= 10条记录。通过加入表格,您要求数据库查找每个表格中的所有数据,其中数据与特定字段进行匹配。

所以是的,这2个查询肯定会给你不同的结果。

+0

它是订阅(1)与客户(很多)的关系,所以它应该给出相同的结果 – stanke

+0

@stanke - 所以提供一个repro向我们展示不同的结果。 –

+0

@MartinSmith我发现内连接是重复的结果,正如你所说的,所以当我在查询中使用内连接进行'独特'时,它给了我与'where ... in'查询中相同的结果。非常感谢! – stanke