2011-05-09 73 views
3

有人可以向我解釋這個SQL查詢匹配什麼語法?奇怪的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 

查詢的想法是讓非保留艇標記使用參數的日期範圍。任何有部分覆蓋範圍的船都不可用。

這個「和...」代碼在那裏如何?爲什麼它缺少像WHERE關鍵字?似乎在那裏隱含着什麼?

+0

maxprice和minprice來自哪個表? – 2011-05-09 18:42:45

+0

發票是表 – BuzzBubba 2011-05-09 21:23:11

+0

您是否意識到您正在檢查以查看最小价格<= 500和最大價格> = 100?爲什麼最低價格高於最高價格? – 2011-05-09 21:28:47

回答

5

當您執行JOIN時,您可以有多個條件。 AND是什麼使得你只有在「this」和「that」是真的時才加入。你也可以將它移到WHERE子句中,但是如果它是JOIN條件的一部分,SQL可以更好地優化它。更不用說在這種情況下,由於LEFT JOIN,它可能會給出不同的結果。我無法分辨,因爲我不確定最大和最小价格來自哪個表格。

簡而言之,它是連接條件的一部分。

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

只需選擇一小部分 - 用'和'作爲JOIN-ON表達式的一部分,對最低價格的檢查就成爲發票行加入限額的一部分。如果它位於WHERE子句中,它將'摺疊'爲內部連接,因爲它會排除'額外'飲料行 - 那些沒有匹配發票行的行。 – n8wrl 2011-05-09 18:30:05

+0

如果我使用WHERE和「WHERE」替換「AND」,或者我得到非常不同的結果(錯誤結果)。 – BuzzBubba 2011-05-09 18:31:24

+0

@ n8wrl:已經處理了「maxprice IS NULL」,即獲得沒有任何發票的飲料的部分。 – BuzzBubba 2011-05-09 18:34:13

1

and...」是你的連接條件的一部分。

1

和條件適用於連接。首先根據條件進行連接,然後將WHERE應用於結果集。

這應該不會返回任何結果,因爲它首先找到maxprice大於等於100且最低價格爲< = 500的飲料列表,所有這些返回的值對於maxprice和minprice都將具有值(非空值)。 WHERE子句中沒有空值可以找到,所以它將返回一個空集。

+0

除非最大和最小价格來自飲料表 – 2011-05-09 18:35:47

+0

它們不 - 我知道它做了什麼,但它是以前使用的嵌套選擇查詢的JOIN版本,一位同事寫道。問題在於,查詢返回所有飲料: - 發票表中沒有發票(發票具有最低和最高價格列,並且可以有多個飲料物品的發票) - 具有發票在發票內的範圍超出上述範圍:低於100或高於500. – BuzzBubba 2011-05-09 18:56:22

0

通過向LEFT JOIN添加附加條件,您實際上告訴SQL Server檢索飲料中的所有行,並從包含匹配飲料的發票中檢索行,其中maxprice大於或等於100,最低價格大於或等於500 如果不存在滿足加入條件的行,則從發票返回NULL行。

在這種情況下,由於您在做SELECT DISTINCT beverage,所以左連接最有可能被優化爲膚淺。

最後的WHERE將刪除查詢中的大部分行。

+0

我知道它的作用,但它是以前使用的嵌套選擇查詢的JOIN版本,一位同事寫道。問題在於,查詢返回所有飲料: - 發票表中沒有發票(發票具有最低和最高價格列,並且可以有多個飲料物品的發票) - 具有發票在發票內的範圍超出上述範圍:低於100或高於500。 – BuzzBubba 2011-05-09 18:56:33