不使用任何隐式/显式连接的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle游标的使用

PL/SQL 游标的使用详解

MySql多表查询

Oracle 游标简介

快速掌握Oracle数据库游标的使用方法有哪些?

关于隐式转换和显式转换