有人可以向我解释这个SQL查询匹配的语法吗?
SELECT DISTINCT boats.boatid
FROM boats LEFT JOIN reservations ON
reservations.boatid = boats.boatid
and (@paramFromDate <= reservations.to AND reservations.from <= @paramToDate )
WHERE reservations.to IS NULL
表:
**boats** boatid
**reservations** reservationid, fk_boatid, from, to
查询的想法是获取标有params的日期范围的非保留船只。任何部分范围甚至部分覆盖的船只都无法使用。
这个“和......”代码怎么样?为什么缺少像WHERE关键字这样的东西?好像WHERE隐含在哪里?
答案 0 :(得分:5)
当你进行JOIN时,你可以有多个标准。 AND就是这样,只有当“this”和“that”为真时才加入。您也可以将其移动到WHERE子句,但如果它是JOIN条件的一部分,SQL可以更好地优化它。更不用说在这种情况下,由于LEFT JOIN,它可能会给出不同的结果。我无法分辨,因为我不确定max和minprice来自哪个表。
简而言之,它是连接条件的一部分。
SELECT DISTINCT beverages.beverageid
FROM beverages
LEFT JOIN invoices ON invoices.beverageid = beverages.beverageid AND (100 <= maxprice AND minprice <= 500)
WHERE maxprice IS NULL
(重写了代码,以便更容易理解)
答案 1 :(得分:1)
“and...
”是您加入条件的一部分。
答案 2 :(得分:1)
和条件适用于联接。首先根据条件进行连接,然后将WHERE应用于结果集。
这应该不返回任何内容,因为它首先找到其maxprice>≥100且最小价格<= 500的饮料列表,所有这些返回值将具有maxprice和minprice的值(非空)。 WHERE子句没有留下空值,因此它将返回一个空集。
答案 3 :(得分:0)
通过向LEFT JOIN添加附加条件,您实际上是在告诉SQL Server从饮料中检索所有行并从包含匹配饮料的发票中检索行,其中maxprice大于或等于100且minprice为大于或等于500 OR 如果不存在满足连接条件的行,则从发票返回NULL
行。
在这种情况下,由于您正在执行SELECT DISTINCT beverage
,因此LEFT JOIN最有可能被优化为肤浅的。
最终WHERE
将从您的查询中删除大多数行。