2013-05-29 2 views
0

хотите выбрать дату тура и названия сайтов до общей стоимости более 230 и этот тур имеет более 7 человек. полный код приведен ниже, первая часть профсоюза работает.Подзапрос с недопустимой ошибкой идентификатора в sql

SELECT tour_date AS "Departure Date", site_name "Site Name" 
FROM partres, reservation, tour, site 
WHERE partres.res_id = reservation.res_id 
    AND reservation.tour_id = tour.tour_id 
    AND tour.site_id = site.site_id 
GROUP BY tour_date, site_name 
HAVING COUNT(part_id) > 7 

    UNION 

SELECT tour_date AS "Departure Date", site_name "Site Name" 
FROM (
    SELECT res_id,tour_date,site_name, (res_partcost +NVL(RES_GEARCOST,0)) as "total_cost" 
    FROM reservation,site,tour) 
WHERE reservation.tour_id = tour.tour_id 
    AND tour.site_id = site.site_id 
    AND total_cost > 230 
GROUP BY tour_date, site_name; 

Я до сих пор есть ошибки, как

ORA-00904: "TOTAL_COST": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 437 Column: 7 

Благодаря

+0

Думаете, вы забыли поместить total_cost в первый оператор SELECT – krasu

+1

что вы пытаетесь выполнить? внутренний запрос не имеет предложения where, поэтому вы не присоединяетесь к таблицам по каким-либо критериям. Бронирование полей. *, Тур. * И сайт. * Недоступны вне вашего внутреннего запроса. – jvilhena

+0

хотите выбрать дату тура и названия сайтов до общей стоимости более 230, и этот тур насчитывает более 7 человек. –

ответ

2

Вы должны переместить условия соединения внутри подзапроса

SELECT tour_date AS "Departure Date", site_name "Site Name" 
FROM (
    SELECT res_id,tour_date,site_name, (res_partcost +NVL(RES_GEARCOST,0)) as "total_cost" 
    FROM reservation,site,tour 
    WHERE reservation.tour_id = tour.tour_id 
    AND tour.site_id = site.site_id) Res1 
WHERE Res1.total_cost > 230 // this will not be displayed in a result 
GROUP BY tour_date, site_name; 
0

union не собирается дать вам "и" между условиями. Он даст вам «или» (потому что все, что соответствует любому условию, будет включено).

Я думаю, вы должны рассказать это как о единичном запросе с подзапросами. Кроме того, собственно присоединиться синтаксис является преимуществом:

SELECT tour_date AS "Departure Date", site_name "Site Name" 
FROM partres p join 
    reservation r 
    on p.res_id = r.res_id join 
    tour t 
    on r.tour_id = t.tour_id and 
     (res_partcost + coalesce(RES_GEARCOST,0)) > 230 join 
    site s 
    on t.site_id = s.site_id 
GROUP BY tour_date, site_name 
having COUNT(part_id) > 7; 

Эта версия делает предположение, что total_cost находится в reservation таблице.

+0

Спасибо, но мне нужно использовать только union –

+0

Я сделал с профсоюзом, спасибо большое –

Смежные вопросы