连接表返回额外的行

时间:2013-04-02 14:56:52

标签: oracle join

我陷入了一个oracle查询

我正在做的是我正在加入cityid的两张桌子。

发生什么事情是当我查询第一个表时它返回486行但当我加入它们时无论哪个连接并加入它在cityid上它 返回570行请告知我如何才能获得486条记录

查询如下

select c.year,c.amount,c.product,g.state 
from Accounts c 
join Address g 
  on g.cityid=c.cityid
order by c.year,c.product;

问候

1 个答案:

答案 0 :(得分:2)

这完全有可能。

如果您有一个给定帐户的多个地址,或某个地址的多个帐户,您可能会收到的行数多于地址或帐户表中的行数。

考虑:

Account
id | ... | cityid
 4 | ... | 12
 5 | ... | 12
 6 | ... | 13
 7 | ... | 14

Address
id | ... | cityid
 2 | ... | 12
 3 | ... | 13
 4 | ... | 14

通过您的加入,您将获得:

Account           Address
id | ... | cityid | id | ... | cityid
 4 | ... | 12     |  2 | ... | 12
 5 | ... | 12     |  2 | ... | 12
 6 | ... | 13     |  3 | ... | 13
 7 | ... | 14     |  4 | ... | 14

所以,你看到有4条记录被返回,即使地址中有3条记录,重复记录地址2。

如果外键关系被颠倒,这可能会走另一条路。

这实际上是关系数据库的核心功能,即保持外键关系输入的数据不需要重复输入数据。

你可以通过只选择要加入的第一个(最低id)值来限制行..这通常涉及创建一个临时表,这是我将留给oracle专家的练习,因为我认为Sybase的语法为这是不同的(并且需要在存储过程中完成,yick)。

我发现自己想知道,除了您所描述的可能更有可能解决您的问题之外,对架构的解释是否会略有不同。