2012-04-03 3 views
4

Я стараюсь отображать информацию о добровольцах с дежурством и о том, какая производительность распределена. Я хочу показать эту информацию. Однако, когда я запускаю запрос, он не собирал другую дату с той же производительности. А также время_доступности перепутано. Это правильный запрос? Я не уверен, что это правильный запрос. Не могли бы вы дать мне несколько отзывов для меня? Спасибо.Запрос 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 join? Не могли бы вы дать мне несколько запросов? Я добавил последний результат, у которого была проблема. Пожалуйста, дайте мне знать. Спасибо. – wholee1

3

Я полагаю, что вы явно написать JOINS, вместо того, чтобы использовать WHERE-синтаксис.

Использование 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) 
+1

+1, poeple должен использовать синтаксис SQL-92 и не прибегать к устаревшему синтаксису SQL-86. – Ollie