2013-03-20 126 views
0

我正在尝试查询酒店数据库以查找预订的总费用。我正在使用子选择查询,但我不断收到错误。SQL子选择查询

这是查询,我希望它显示预订ID和房间号以及总成本。

SELECT BOOKING_ID, ROOM_NO , SUM(TOTAL) AS TOTAL FROM 
    (
     SELECT (END_DATE-START_DATE) DAYDIFF, ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL_ROOM 
     FROM ROOM_TBL NATURAL JOIN ROOM_DETAILS_TBL WHERE BOOKING_ID = &BOOKING_ID 
    ) FROM ROOM_TBL; 

这是错误:

ERROR at line 3: 
ORA-00907: missing right parenthesis 
+1

太多栌那里,删除后的最后一个) – 2013-03-20 17:53:45

+0

的我喜欢Oracle的东西是它将任何错误转化为“缺少括号”错误。我很确定,如果磁盘空间不足,你会得到'缺少括号'。 – 2013-03-20 17:55:36

回答

0

好你的几个问题。

首先,在子查询之前的查询中有两个FROM,子查询之后有一个。

其次,你没有GROUP BY,但你有一个聚合函数被使用。

它看起来像你可能想:

SELECT BOOKING_ID, ROOM_NO , SUM(TOTAL) AS TOTAL 
FROM 
(
    SELECT BOOKING_ID, 
     ROOM_NO, 
     (END_DATE-START_DATE) DAYDIFF, 
     ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
    FROM ROOM_TBL 
    NATURAL JOIN ROOM_DETAILS_TBL 
    WHERE BOOKING_ID = &BOOKING_ID 
) 
GROUP BY BOOKING_ID, ROOM_NO; 

编辑,如果你想有一个TOTAL行,那么你可以使用GROUP BY ROLLUP

SELECT max(BOOKING_ID) Booking_id, 
    case when ROOM_NO is null then ' ' else room_no end Room_no, 
    SUM(TOTAL) AS TOTAL 
FROM 
(
    SELECT BOOKING_ID, 
     ROOM_NO, 
     (END_DATE-START_DATE) DAYDIFF, 
     ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
    FROM ROOM_TBL 
    NATURAL JOIN ROOM_DETAILS_TBL 
    WHERE BOOKING_ID = &BOOKING_ID 
) 
GROUP BY ROLLUP (room_no); 

SQL Fiddle with Demo

如果你想列中的数据,则可以在子查询上使用公用表表达式:

with cte as 
(
    SELECT BOOKING_ID, 
     ROOM_NO, 
     (END_DATE-START_DATE) DAYDIFF, 
     ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
    FROM ROOM_TBL 
    NATURAL JOIN ROOM_DETAILS_TBL 
) 
select booking_id, 
    room_no, 
    total, 
    case when rn = 1 then totalbooking else null end totalbooking  
from 
(
    select booking_id, 
     room_no, 
     total, 
     (select sum(total) from cte) TotalBooking, 
     row_number() over(partition by booking_id order by room_no) rn 
    from cte 
) 

SQL Fiddle with Demo

+0

有一些不请自来的建议:确保仅限日期(无时间分量)“ROOM_TBL.START_DATE”和“ROOM_TBL.END_DATE”,否则会得到一些非常奇怪的结果。不要相信其他程序员(或者你自己)为了保持日期清洁。您可以使用检查约束来强制执行此操作:'CHECK(END_DATE = TRUNC(END_DATE))'和类似的'START_DATE'。 – 2013-03-20 18:05:55

+0

我试图以这种方式运行查询,但仍然得到了同样的错误: 错误在第7行: ORA-00907:缺少右括号 – user1909680 2013-03-20 19:25:41

+0

@ user1909680您可以使用表结构和一些示例数据编辑原始文章吗? – Taryn 2013-03-20 19:26:52

0

虽然我不知道在你的架构中的各种属性,试试这个:

SELECT z.BOOKING_ID, r.ROOM_NO , SUM(TOTAL) TOTAL 
FROM (SELECT ri.room_No, dt.Booking_id, 
      (END_DATE-START_DATE) DAYDIFF, 
      ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
     FROM ROOM_TBL ri 
      NATURAL JOIN ROOM_DETAILS_TBL dt 
     WHERE BOOKING_ID = &BOOKING_ID) z 
    Join ROOM_TBL r 
    On r.ROOM_NO = z.Room_No