繁体   English   中英

SQL查询:On子句和where子句的条件差异

[英]SQL Query: difference in condition in On clause and where clause

我试图得到下面两个查询之间的区别

查询1:

在其中我在on子句中给出了条件'Orders.OrderID!= null'

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON (Customers.CustomerID=Orders.CustomerID and Orders.OrderID is not null)

查询2:

在其中我在where子句中给出了条件'Orders.OrderID!= null'

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID where Orders.OrderID is not null

这两个查询正在生成差异结果。 为什么? where子句和on condition子句的执行流程是什么?

PS我正在使用以下链接来测试查询http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join

查询1中的区别在于,Orders.OrderID!= null(或Orders.OrderId不为null)用于过滤Orders表中的行,而在query2中,它用于过滤结果集中的行。

!= NULL更改为IS NOT NULL

!= NULL更改为IS NOT NULL并且不要忘记在ON子句中放置括号。

这样,您可以告诉服务器在加入时希望所有条件都满足(括号内)。

Q2实际上与INNER JOIN Orders相同。

没有对等体的行将被过滤掉。

更新

对于Q1,如果条件为false,则来自客户的行将包含在结果中。 对于第二季度,左行被滤除,因为hteir OrderId为null

您的查询的语法与T-Sql相似,只是比较“!=”。 如果您使用的是MSSQL Server,则测试null值的正确方法是OrderId is not null

除了使用不同的运算符外,查询的行为还受处理顺序的影响。 WHERE子句条件根据所有JOIN的结果进行评估。 对于MSSQL来说确实如此。 因此,将条件放在WHERE子句中的效果与执行INNER JOIN相似,只是浪费了更多的资源。

区别在于,第一个查询将输出第一个表中的所有行,而仅输出第二个表中与条件匹配的行。 这意味着属于第二个表的列将为null ,但结果中仍将存在合并的行。

在第二种情况下,订单ID为null组合行将被删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM