0

私はオラクルのクエリで立ち往生しています

私がやっていることは、cityid の 2 つのテーブルを結合することです。

最初のテーブルにクエリを実行すると 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

したがって、Address に 3 つのレコードがあり、レコード Address.2 が繰り返されているにもかかわらず、4 つのレコードが返されていることがわかります。

外部キーの関係が逆になった場合、これは逆になる可能性があります。

そして、これは実際にはリレーショナル データベースの核となる機能であり、外部キーの関係が維持された状態で入力されたデータは、データ入力を繰り返す必要がありません。

結合する最初の (最小の ID) 値のみを選択することで、行を制限できます。これには通常、一時テーブルの作成が含まれます。これは、Sybase の構文が異なるため、オラクルの専門家に任せます。 (そして、ストアドプロシージャ内で実行する必要があります、yick)。

問題を解決する可能性が高いと思われるスキーマの解釈が、あなたが説明したものとは少し異なるのではないかと考えています。

于 2013-04-02T15:12:23.927 に答える