4

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

ここに画像の説明を入力

クエリはこちら。

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

-- 画像を追加 -- 結果: ここに画像の説明を入力

4

2 に答える 2

6

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

ただし、 に関連する問題があるとおっしゃっているので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そのクエリを実行します。など。

于 2012-04-03T20:08:14.647 に答える
3

WHERE 構文を使用する代わりに、JOINS を明示的に記述することをお勧めします。

INNER JOIN を使用して、説明しているクエリは次のようになります。

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)
于 2012-04-03T20:07:49.373 に答える