奇怪的SQL连接

时间:2011-05-09 18:24:25

标签: sql sql-server tsql

有人可以向我解释这个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隐含在哪里?

4 个答案:

答案 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将从您的查询中删除大多数行。