2012-04-03 57 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添加到查询条件。

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

举例来说,我可能会与此开始:

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

如果给出的结果有意义,那么我会去上添加一个加盟performance_duty和运行查询。等等。

+0

谢谢你的回复。当我尝试使用您的查询时,它正在工作,但我如何使用ANSI连接语法来使用所有表?你能给我一些问题吗?我添加了最后一个有问题的结果。请让我知道。谢谢。 – wholee1 2012-04-03 21:09:43

3

我建议你明确写入JOINS而不是使用WHERE语法。

使用内部连接你所描述的查询,可能是这样的:

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 2012-04-04 08:08:33