到目前為止,本書中所有的連接幾乎都是等值連接,也就是在這種連接的ON子句的條件包含一個等號運算。等值連接是最常用的連接,因為它指定的連接條件是一個表中的一個字段必須等於另一個表中的一個字段。
處理等值連接,還存在另外一種不等值連接,也就是在連接的條件中可以使用小於(<)、大於(>)、不等於(<>)等運算符,而且還可以使用LIKE、BETWEEN AND等運算符,甚至還可以使用函數。
例如,如果需要檢索價格小於每個客戶的年齡的五倍值的訂單列表,那么就可以使用不等值連接,實現的SQL語句如下所示:
SELECT T_Order.FNumber,T_Order.FPrice,T_Customer.FName,T_Customer.FAge FROM T_Order INNER JOIN T_Customer ON T_Order.FPrice< T_Customer.FAge*5
執行完畢我們就能在輸出結果中看到下面的執行結果:
FNumber FPrice FName FAge
K001 100.00 TOM 21
K001 100.00 MIKE 24
K001 100.00 JACK 30
K001 100.00 TOM 25
N002 100.00 TOM 21
N002 100.00 MIKE 24
N002 100.00 JACK 30
N002 100.00 TOM 25
T002 100.00 TOM 21
T002 100.00 MIKE 24
T002 100.00 JACK 30
T002 100.00 TOM 25
不等值連接產生了大量的查詢結果,因為它是對被連接的兩張表做了笛卡爾運算,所以如果只想查看與客戶對應的訂單,那么就要在不等值連接后添加等值連接匹配條件。實現的SQL語句如下:
SELECT T_Order.FNumber,T_Order.FPrice,T_Customer.FName,T_Customer.FAge FROM T_Order INNER JOIN T_Customer ON T_Order.FPrice< T_Customer.FAge*5 and T_Order.FCustomerId=T_Customer.FId
這里添加了“and T_Order.FCustomerId=T_Customer.FId”這個條件來限制匹配規則。執行完畢我們就能在輸出結果中看到下面的執行結果:
FNumber FPrice FName FAge
K001 100.00 TOM 21
N002 100.00 MIKE 24