以下代码从数据库中检索了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
这是什么不等于符号对我的搜索查询?外部连接也有相同的区别。
谢谢。
<>
是sql中的"非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;
on Operator
从逻辑上讲,每个SQL查询都是按以下顺序执行的:
FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY
您可以从MSDN的官方文档中进一步阅读有关此信息。选择(Transact-SQL)
这意味着on
谓词与表之间的基本匹配有关,而WHERE
子句过滤结果。
红衣主教平均值1:n或侧面匹配的数量。在您的示例中,ON A.CUSTOMER_ID = B.CUSTOMER_ID
将返回从源表
LEFT
和RIGHT
请参阅源表是哪个侧。默认情况下, 左被视为源表。
因此,如果表A有3行,则在ID = 3
的位置,即使表B只有一个ID为3,您也会返回3行;表A中的每一行均分别处理。
良好的联接仅使用返回唯一连接所需的列数,以免返回不必要的重复值。即使您打算使用CROSS JOIN
,您仍然需要确保为您的目的使用独特的匹配集。
相关地,加入是什么意思?
这是一个真正的问题:表代表什么?它们如何回答问题?关系意味着价值,信息,问题或回答的问题。
当您知道批处理或proc做什么或它的目的是脚本的目的时,识别愚蠢的查询变得更容易。
结论
-
ON ID = ID
-选择匹配行。 -
ON ID <> ID
-返回源表中每个行的每个不匹配行。本质上是十字架加入减去实际的联接行。
良好的做法是使用on识别匹配的唯一行和在源表侧面过滤此结果的独特行。
当值不等于
时,不相等的<>
运算符返回true代码on O.CustomerID <> c.CustomerID
似乎将订单表的每一行与客户表的每一行都不等于它。这是SQL小提琴中的一个示例。
http://sqlfiddle.com/#!9/e05f92/2/0
您可以看到,在顶部选择中(使用一个=符号的一个),它仅选择customerID订单等于customer customeruction
的行在底部选择中(使用&lt;>使用),它加入了每个客户行,每个可能的订单行不相等,这就是为什么您获得&lt;>查询的结果很多。