2013-04-02 71 views
0

我被困在一個oracle查詢加入表返回額外的行

我在做什麼是我加入兩個表上有cityid。

最新發生的事情是,當我詢問的第一個表的返回486行,但是當我不管加入他們其中加入和加入它在它 返回570行cityid請指點我怎樣才能得到只有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; 

問候

+0

這是HQL查詢,你能否給我們使用映射?從HQL查詢中,加入是使用cityid而不是cust ID完成的。 – TheEwook

+0

thx theewook我寫錯了 –

+0

爲什麼名爲「地址」的表將作爲城市查找表?看起來「地址」表很可能每個城市有多個記錄,可能不是您應該使用的表格。 – GriffeyDog

回答

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條記錄地址,與唱片Address.2重複。

如果外鍵關係被顛倒過來,這可能是另一種方式。

而這實際上是關係數據庫的核心功能,使用外鍵關係輸入的數據不需要重複輸入數據。

您可以通過選擇僅加入的第一個(最低id)值來限制行。這通常涉及到創建一個臨時表,這是一個練習,我將留給Oracle專家,因爲我認爲Sybase的語法因爲這是不同的(並且需要在存儲過程中完成,yick)。

我發現自己想知道,除了您所描述的可能會更有可能解決您的問題之外,是否會對架構有一個稍微不同的解釋。

+0

嗨,感謝在我的情況rply cityids是外鍵和外鍵加入將返回重複值,所以我如何獲得唯一值 –

+0

您可以添加不同的(Account.cityid)到選擇,但這可能不是什麼你希望。我真的認爲理解完整模式還有一點缺失。 – PaulProgrammer

+0

看到我有兩個視圖從第一個視圖我想要在這個視圖中的產品其數量和數量使用cityid這是一個外鍵,我加入cityid的第二個視圖再次獲得該狀態城市id是外鍵和狀態包含許多城市。當IAM只查詢第一個視圖時,它會重新運行486條記錄,如果我通過加入第二個視圖來查詢它,它會回溯540條記錄,其中7條記錄爲空citis tahat,我使用where子句過濾我可能會做什麼錯誤 –