不使用任何隐式/显式连接的 SQL 查询
Posted
技术标签:
【中文标题】不使用任何隐式/显式连接的 SQL 查询【英文标题】:SQL query without using any implicit/explicit joins 【发布时间】: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 数据库,我想回答两个问题:
-
选择所有名字为“John”且预订日期未定义的 guestID。不允许显式或隐式连接。
到目前为止,我已经使用显式连接来完成它,以了解如何避免使用连接。我不知道如何不对这个查询使用连接,所以这就是我首先寻求帮助的原因。
到目前为止我的代码:
SELECT GUEST.GUESTID
FROM GUEST
INNER JOIN BOOKING ON BOOKING.GUESTID = GUEST.GUESTID
WHERE BOOKING.DATETO IS NULL
AND GUEST.GUESTNAME = 'John%';
-
选择名为“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 中。
【问题讨论】:
【参考方案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'
【讨论】:
以上是关于不使用任何隐式/显式连接的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章