【问题标题】:SQL query without using any implicit/explicit joins不使用任何隐式/显式连接的 SQL 查询
【发布时间】:2021-04-24 15:26:13
【问题描述】:

我有这些表:

  • MOTEL:汽车旅馆 ID (PK)、汽车旅馆名称、城镇
  • ROOM:roomID (PK)、motelNo (PK)、类型、费用
  • 预订:motelNo (PK)、guestID (PK)、dateFrom (PK)、dateTo、roomID
  • GUEST:guestID (PK)、guestName、guestAddress

对于这个 SQL 数据库,我想回答两个问题:

  1. 选择所有名字为“John”且预订日期未定义的 guestID。不允许显式或隐式连接。

到目前为止,我已经使用显式连接来完成它,以了解如何避免使用连接。我不知道如何不对这个查询使用连接,所以这就是我首先寻求帮助的原因。

到目前为止我的代码:

SELECT GUEST.GUESTID 
FROM GUEST
INNER JOIN BOOKING ON BOOKING.GUESTID = GUEST.GUESTID 
WHERE BOOKING.DATETO IS NULL
  AND GUEST.GUESTNAME = 'John%';
  1. 选择名为“Jollife”的汽车旅馆的所有房间的费用和房间 ID。如果房间已被占用(根据数据库),请说明房间占用者的 guestName。

所有日期的格式为 yyyymmdd。

到目前为止我的代码:

SELECT COST.PRICE, ROOM.ROOMID 
FROM ROOM
INNER JOIN MOTEL ON MOTEL.MOTELID = ROOM.MOTELID
FULL OUTER JOIN BOOKING ON ROOM.MOTELID = BOOKING.MOTELID

我尝试通过基于 motelID 对“ROOM”和“MOTEL”进行内部连接,然后使用“BOOKING”进行完全外部连接来开始这个问题,以便可以检查“dateTo”。我不知道从这里去哪里。这是在 postgresql 中。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    对于第一个问题,您可以使用:

    SELECT GUEST.GUESTID FROM GUEST    
    WHERE  GUEST.GUESTNAME='John%'
    and exists ( select top 1 1 ---This is faster then  * 
    form BOOKING 
    where BOOKING.GUESTID=GUEST.GUESTID  
    and BOOKING.DATETO IS NULL
    )
    

    对于第二个问题,你要做:

    SELECT COST.PRICE, ROOM.ROOMID, case when booking.GuestId is not null then guest.guestName else 'Vacent' end as OcupiedBy FROM ROOM
    INNER JOIN MOTEL ON MOTEL.MOTELID=ROOM.MOTELID
    left join BOOKING ON ROOM.MOTELID=BOOKING.MOTELID
    left join Guest on BOOKING.GUESTID=GUEST.GUESTID  
    where motel.MotelName = 'Jollife'
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2019-05-27
      • 2012-07-17
      • 1970-01-01
      相关资源
      最近更新 更多