【问题标题】:SQL Query between 3 tables3个表之间的SQL查询
【发布时间】:2010-12-21 08:33:54
【问题描述】:

我有 3 个表(注意这可能不是最好的 sql db 设计)

Room: TypeName, RoomNumber
RoomType: TypeName, ...
Reservation: StartDate, EndDate, TypeName, RoomNumber

我的输入参数是startdateenddate。我想知道不同的roomtypes 可用。据我了解,解决方案是这样的:AvailableRoomTypes = AllRoomTypes - UnavailableRoomTypes

显然AllRoomTypes 可以通过以下方式找到:SELECT DISTINCT(TypeName) FROM Room; 我知道如何获得不可用的房间,但不是不可用的roomtypes。我也不知道如何从另一组中减去一组。我可以得到一组所有的rooms+roomtypes 和另一组不可用的rooms+roomtypes,但是我如何加入它们使得它是A-B?也许某种NOT_CONTAINS 函数?

我希望我的输出参数为SELECT * FROM RoomType (for the appropriate roomtypes)

【问题讨论】:

  • 什么数据库,你能更清楚什么是表,什么是列?
  • 这就是我所拥有的:SELECT r.roomtype, s.servicename FROM RESERVATION r JOIN BILLING b ON b.reservationid = r.reservationid AND b.paid = 1 JOIN Customer_SERVICE s ON s.customerserviceid = b .customerserviceid;我需要为每个不同的 reservation.roomtype 和 customer_service.servicename 汇总 billing.total。那么我是否要:选择 SUM(b.total) 进行预订...加入选择 SUM(b.total) 进行服务...?

标签: sql select distinct contains


【解决方案1】:
SELECT t.*
  FROM ROOMTYPE t
 WHERE NOT EXISTS(SELECT NULL 
                    FROM RESERVATION r
                    JOIN ROOM ro ON ro.roomnumber = r.roomnumber
                   WHERE ro.typename = t.typename
                     AND r.startdate BETWEEN ?IN_START_DATE AND ?IN_END_DATE
                     AND r.enddate BETWEEN ?IN_START_DATE AND ?IN_END_DATE)

【讨论】:

    【解决方案2】:

    未使用的房间类型

    select RT.* 
    from RoomType RT
    where RT.TypeName not in (
       Select RM.TypeName 
       from Room RM
    ) 
    

    进行 A-B 选择的一种方法是“不在 (select ..)”运算符中,不存在 (select ..) 是另一种方法,我敢肯定会有更多。

    【讨论】:

    • @Russ Cam:我不知道什么是“差异联合”联合(谷歌表示它也不知道)!您是否愿意发布对 OP 的问题的答案,以证明“差异联盟”?但是你的观点是正确的,我的回答听起来很绝对,好像“不开”是解决 OP 问题的唯一方法。会改写!
    • tsql 中的差异联合:SELECT blah blah blah EXCEPT SELECT blah blah blah
    • 感谢它成功了,这是我似乎无法轻易找到的最终逻辑,尽管它看起来相当基本
    【解决方案3】:

    房间:TypeName、RoomNumber RoomType:TypeName、... 预订:StartDate、EndDate、TypeName、RoomNumber

    这可能是你的答案...
    选择 rt.typename
    从房间 r,房间类型 rt,重新预订
    其中 r.typename=rt.typename
    和 rt.typename=re.typename
    其中 re.startdate=:start_date
    和 re.enddate=:endate

    【讨论】:

      【解决方案4】:

      您不想使用 UNION - SUM(reservation.roomtype)SUM(service.servicetype) 是不同的属性。但是如果你这样做了,你会想要使用 NULL 来抵消查询,这样列就不会重叠。即:

      SELECT SUM(reservation.roomtype), NULL ...
      UNION ALL
      SELECT NULL, SUM(service.servicetype) ...
      

      根据您提供的逻辑,这是我提出的查询:

      SELECT SUM(r.roomtype),
             SUM(s.servicetype)
        FROM RESERVATION r
        JOIN BILL b ON b.reservationid = r.reservationid
                   AND b.paid = 1
        JOIN SERVICE s ON s.serviceid = b.serviceid
      

      这将返回一行。为了返回更有意义的结果集,我们需要知道查询(或取决于信息的查询)分组的内容。 RESERVATIONSERVICE 表的详细信息将帮助我们为您提供帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-08
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多