0

我被困在一个 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;

问候

4

1 回答 1

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 条记录,尽管 Address 中有 3 条记录,其中记录 Address.2 被重复。

如果外键关系被颠倒,这可能会发生相反的情况。

而这其实是关系型数据库的核心特点,输入的数据保持外键关系,不需要重复输入。

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

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

于 2013-04-02T15:12:23.927 回答