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到查询条件。

我更一般的建议是从头开始编写查询,一次添加一个表,并使用 ANSI 连接语法。这将更清楚哪些条件与哪些连接相关,并且如果您一次添加一个表,希望您会看到结果出错的点。

例如,我可能会从这个开始:

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

如果这给出了有意义的结果,那么我将继续添加一个连接performance_duty并运行该查询。等等。

于 2012-04-03T20:08:14.647 回答
3

我建议您明确编写 JOINS,而不是使用 WHERE-Syntax。

使用 INNER JOINs 您描述的查询可能如下所示:

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 回答