2012-04-03 25 views
4

私は義務とどのようなパフォーマンスが割り当てられているボランティア情報を表示しようとしています。 この情報を表示します。ただし、クエリを実行すると、同じパフォーマンスから異なる日付が収集されませんでした。また、availability_dateも混在しています。それは正しい質問ですか?私はそれが正しいクエリであるかどうかはわかりません。 私に何かフィードバックをいただけますか?おかげさまで 複数のテーブルを持つOracleクエリ

enter image description here

問合せはこちらです。

SELECT Production.name, performance.performance_date, volunteer_duty.availability_date, customer.name "Customer volunteer", volunteer.volunteerid, membership.name "Member volunteer", membership.membershipid 
FROM Customer, Membership, Volunteer, volunteer_duty, duty, performance_duty, performance, production 
WHERE 
Customer.customerId (+) = Membership.customerId AND 
Membership.membershipId = Volunteer.membershipId AND 
volunteer.volunteerid = volunteer_duty.volunteerid AND 
duty.dutyid = volunteer_duty.dutyid AND 
volunteer_duty.dutyId = performance_duty.dutyId AND 
volunteer_duty.volunteerId = performance_duty.volunteerId AND 
performance_duty.performanceId = performance.performanceId AND 
Performance.productionId = production.productionId 

--Added image-- 結果: enter image description here

答えて

5

問合せは、それがすべてのテーブル間の結合条件を適当であると思われるものを持つという点で、合理的なようです。結果とどのような問題があるのか​​はわかりません。より詳細に説明したり、関連するデータのサブセットを示したりすれば、役立つかもしれません。

しかし、availability_dateに関連する問題があると言われているので、私の最初の考えは、その欄に何らかの条件を付けて、与えられた任務のためにボランティアが特定の任務のために利用できるようにすることです。これは単にクエリ条件にvolunteer_duty.availability_date = performance.performance_dateを追加することを意味するかもしれません。

もっと一般的には、一度に1つのテーブルを追加し、ANSI結合構文を使用してクエリを書き始めることをお勧めします。これにより、どの条件がどのジョインに関連しているかが明確になります。一度に1つのテーブルを追加すると、結果が間違っている箇所が表示されることがあります。例えば

、私はおそらくこれで始めたい:

SELECT production.name, performance.performance_date 
    FROM production 
     JOIN performance ON production.productionid = performance.productionid 

それが意味をなすの結果を与えた場合、私はperformance_dutyに参加し、そのクエリを実行する追加するに行くだろう。その他。

+0

返信いただきありがとうございます。クエリを使用しようとすると動作しますが、ANSI結合構文を使用してすべてのテーブルを使用するにはどうすればよいですか?あなたは私のためにいくつかのクエリを教えていただけますか?私は問題があった最後の結果を加えました。私に知らせてください。ありがとうございました。 – wholee1

3

私はあなたが明示的に代わりにWHERE-構文を使用しての、JOINS書くことを示唆しています。 INNERを使用して

はあなたが記述しているクエリを結合し、次のようになります。

SELECT * 
FROM volunteer v 
INNER JOIN volunteer_duty vd ON(v.volunteerId = vd.colunteerId) 
INNER JOIN performance_duty pd ON(vd.dutyId = pd.dutyId AND vd.volunteerId = pd.colunteerId) 
INNER JOIN performance p ON (pd.performanceId = p.performanceId) 
+1

+1、poepleはSQL-92構文を使用する必要がありますが、古いSQL-86構文には依然として固執していないはずです。 – Ollie

関連する問題