我正在尝试区分以下2个查询
查询1:
我在条款中给出条件'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子句和条件子句的执行流程是什么?
P.S我使用以下链接来测试查询http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join
答案 0 :(得分:3)
在查询1中,ORders.OrderID!= null(或Orders.OrderId不为空)的差异用于过滤Orders表和query2中的行,它用于过滤行中的行结果集。
答案 1 :(得分:0)
将!= NULL
更改为IS NOT NULL
答案 2 :(得分:0)
将!= NULL
更改为IS NOT NULL
,不要忘记将括号放在ON
子句中。
通过这种方式,您可以告诉服务器您希望在加入时满足所有条件(括号内)。
答案 3 :(得分:0)
Q2实际上与INNER JOIN Orders
相同。
过滤掉没有对等的行。
更新
对于Q1,如果条件为假,则来自Customers的行包含在结果中。 对于Q2,左边连接的行被过滤掉,因为hteir OrderId为空
答案 4 :(得分:0)
除了比较“!=”之外,查询的语法与T-Sql类似。如果您使用的是MSSQL Server,则测试空值的正确方法是OrderId is not null
。
除了使用不同的运算符之外,查询的行为也是由处理顺序驱动的。根据所有JOIN的结果评估WHERE子句条件。对于MSSQL来说也是如此。因此,在WHERE子句中放置条件具有与进行INNER JOIN类似的效果,除非您浪费更多资源。
答案 5 :(得分:0)
不同之处在于,第一个查询将输出第一个表中的所有行,并且只输出第二个表中匹配条件的那些行。这意味着属于第二个表的列将为null
,但组合行仍将存在于结果中。
在第二种情况下,将删除订单ID为null
的组合行。