在sql语句中组合union和WHERE条件

时间:2013-03-20 15:40:59

标签: sql oracle join union

模式:

   BookingDependent ( BookinngID(pk,fk) , DependentID(pk,fk))
   Booking (BookingID(pk),GuestID(fk), ArriveDate,DepartDate, Totalprice) 

SQL语句试图:

SELECT g.FORENAME, g.SURNAME       
FROM GUEST g
INNER JOIN BOOKING b ON g.GUESTID = b.GUESTID
UNION
SELECT d.FORENAME, d.SURNAME
FROM DEPENDANT d
INNER JOIN BOOKINGDEPENDANT bd ON bd.DEPENDANTID = d.DEPENDANTID
WHERE (SELECT * FROM BOOKING b
WHERE b.DEPARTDATE > '20-MAR-2013');

大家好,我试着构建一个sql查询,列出目前住在酒店的所有客人和家属,而不是显示数据库中的所有历史客人和家属。我想简单地显示所有在场的客人和家属。我在WHERE子句中遇到了缺少表达式错误的问题。我怎样才能解决这个问题 ?我也想使用工会。

1 个答案:

答案 0 :(得分:1)

您缺少将WHERE子句过滤器与查询的其余部分相关联的列。

您似乎想要使用以下查询:

SELECT g.FORENAME, g.SURNAME       
FROM GUEST g
INNER JOIN BOOKING b 
   ON g.GUESTID = b.GUESTID
WHERE b.DEPARTDATE > '20-MAR-2013'
UNION
SELECT d.FORENAME, d.SURNAME
FROM DEPENDANT d
INNER JOIN BOOKINGDEPENDANT bd 
   ON bd.DEPENDANTID = d.DEPENDANTID
WHERE bd.BookingID in (SELECT b.bookingid   
                       FROM BOOKING b
                       WHERE b.DEPARTDATE > '20-MAR-2013');

您会注意到我将WHERE条款更改为WHERE bd.BookingID in ..。这将返回具有您想要的BookingId的{​​{1}}的所有行。