Oracle 联接表返回额外的行

Oracle 联接表返回额外的行,oracle,join,Oracle,Join,我陷入了一个oracle查询中 我现在做的是把两张桌子连接在一起 当我查询第一个表时,它返回486行,但当我加入它们时,不管是哪一个加入,都会在cityid it上加入它 返回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; 这是完全可能的 如果给定

我陷入了一个oracle查询中

我现在做的是把两张桌子连接在一起

当我查询第一个表时,它返回486行,但当我加入它们时,不管是哪一个加入,都会在cityid it上加入它 返回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;

这是完全可能的

如果给定的帐户有多个地址,或者给定的地址有多个帐户,那么您可能会得到比地址或帐户表中的行更多的行

考虑:

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)


我发现自己在想,在您描述的模式之外,是否有一种稍微不同的解释更可能解决您的问题。

这是HQL查询,您能给我们使用的映射吗?从HQL查询中,连接是使用cityid而不是cust id完成的。thx theewook我写错了为什么名为“Address”的表将用作city表的查找状态?似乎每个城市的
地址
表可能有多条记录,可能不是您应该使用的表。您好,感谢rply在我的情况下,cityid是外键,外键join将返回重复的值,因此如何获取唯一值您可以将distinct(Account.cityid)添加到select,但这可能不是你所希望的。我真的认为在理解完整的模式时缺少了一部分。看,我从第一个视图中有两个视图我想要产品它的数量和计数在这个视图中使用cityid,它是一个外键,我加入第二个视图的cityid,再次获得该状态city id是外键,一个状态包含许多城市。当iam仅查询第一个视图时,它会重新返回486条记录,如果我通过加入第二个视图进行查询,它会返回540条记录,其中7条记录为空,我使用where子句进行了筛选。我可能做得不好。好吧,视图是邪恶的,所以尽量不要使用它们。它们导致了令人惊讶的结果。我从未见过连接返回空的左或右记录,除非它是外部连接。我想您可以添加一个where子句来删除空值:。。。where Address.cityid不是空的hi paul谢谢你的帮助我设法纠正了它每个城市都有分支机构,这些分支机构映射到同一个城市id,因此产生了额外的记录。