以下代码从数据库中检索了74,700行。
select * from Orders O
inner join customers C
on O.CustomerID <> c.CustomerID
带=的相同代码检索830条记录。
select * from Orders O
inner join customers C
on O.CustomerID = c.CustomerID
这不等于符号对我的搜索查询做什么?外连接也有相同的区别。
谢谢。
答案 0 :(得分:3)
<>
是SQL中的“not-equals”运算符。
查询获取customerId
列不同的所有配对或订单和客户。您真正想要的可能是没有有效客户ID的订单:
select o.*
from orders o left join
customers c
on o.CustomerID = c.CustomerID
where c.CustomerId is null;
(实际上,如果您设置了正确的外键关系,这似乎不太可能。)
或者更有可能是没有订单的客户:
select c.*
from customers c left join
orders o
on o.CustomerID = c.CustomerID
where o.CustomerId is null;
答案 1 :(得分:0)
&LT;&GT;符号表示不等于ie)O.CustomerID 不等于 c.CustomerID或 你可以使用!=这也意味着在sql中不等于
答案 2 :(得分:0)
当值为NOT EQUAL时,不等于<>
运算符返回true
代码on O.CustomerID <> c.CustomerID
似乎将orders表的每一行与customers表的每一行都不相等。这是SQL小提琴中的一个例子。
http://sqlfiddle.com/#!9/e05f92/2/0
如您所见,在顶部选择(使用了=符号的那个)中,它只选择订单customerID等于Customer customerID的行
在底部选择(使用&lt;&gt;)的情况下,它会连接每个客户行,每个可能的订单行都不相等,这就是为什么你得到&lt;&gt;的结果很多的原因。查询。
答案 3 :(得分:0)
ON运营商
逻辑上,每个SQL查询都按以下顺序执行:
FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY
您可以从MSDN的官方文档中进一步了解这一点。 SELECT (Transact-SQL)
这意味着on
谓词与表之间的基数匹配相关,而WHERE
子句则过滤结果。
基数表示1:N,或与一方匹配的数量。在您的示例中,ON A.CUSTOMER_ID = B.CUSTOMER_ID
将为源表
LEFT
和RIGHT
指的是源表的哪一侧。默认情况下 left被认为是源表。
因此,如果表A有3行ID = 3
,那么即使表B只有一个ID为3,也会返回3行;表A中的每一行都是单独处理的。
良好的连接仅使用返回唯一连接所需的列数,因此不会返回不需要的重复值。即使你打算使用CROSS JOIN
,你仍然需要确保使用独特的匹配集。
关系,联接是什么意思?
这是一个真正的问题:表格代表什么以及他们如何回答问题? 关系是指回答的价值,信息,问题或疑问。
当您知道批处理或proc的作用或脚本的用途时,识别愚蠢的查询会变得更容易。
<强>结论强>
ON ID = ID
- 选择匹配的行。ON ID <> ID
- 返回源表中每一行的每一行 。基本上是交叉连接减去实际的连接行。好的做法是使用ON来标识匹配的唯一行,并使用WHERE子句在源表的一侧过滤此结果。