-3

我正在搜索并尝试获取 SQLExists运算符,但直到我自己在 SQL Server 2008 中自己完成但仍不清楚它之前无法理解它,帮助

例如

看我自己做了一些查询来检查它的实际作用,

// using IN
select 
    customers.cus_id, customers.cusName 
from 
    customers 
where 
    customers.cus_id IN (Select cus_id from products 
                         where prodCategory= 'Consumer electronics')

// using Exists
Select 
    customers.cus_id, customers.cusName 
from 
    customers
where 
    exists (select cus_id from products 
            where prodCategory = 'Consumer electronics' AND customers.cus_id = products.cus_id)

两者都给出相同的结果,但是当我从第二个查询的子查询中删除这部分时

......AND customers.cus_id=products.cus_id

然后它没有给出正确的结果,返回所有记录Customers表格。为什么?我认为它会清除我的概念,但几乎不需要帮助,帮助!

4

4 回答 4

3

因为它是两个表之间的唯一连接。该方法通过列IN链接两个表,但通过 PK 和 FK连接。 如果您删除它,则不再有任何关系。cus_idEXISTScustomersproducts

你用什么是口味问题。同时我更喜欢EXISTS/NOT EXISTS因为它是可读的并且没有副作用,因为没有连接并且根本没有选择任何内容。

特别是NOT IN如果该列可以为空,则会出现问题。值得一读:http ://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

于 2013-11-08T23:53:31.780 回答
0

如果删除该条件,则删除在 where 中评估的当前记录与子查询中的相应记录之间的连接。

对于所有记录,子查询将具有相同的结果,并且始终包含该类别中的所有产品。因此,如果该类别中有任何产品,它将返回所有客户,而不管客户与产品之间的任何关系。

使用时in,子查询中不需要该关系,因为该in操作正在处理该关系。

于 2013-11-08T23:52:55.797 回答
0

这个查询:

Select cus_id from products where prodCategory= 'Consumer   electronics'

将返回具有匹配Consumer Electronics的所有cus_id值的列表。该子句意味着如果包含在该列表中,则将返回该行。所以,它有点内置AND。prodCategoryINcustomers.cus_id

但是,该EXISTS子句意味着如果子查询包含任何行,则将返回该行。它不关心该子查询的值是什么。因此,您必须添加AND以防止它返回其他不匹配的行customers.cus_id

于 2013-11-08T23:55:07.393 回答
0

我们可以使用这两个运算符来获取相同的结果。在我们进入实际情况之前,让我举几个例子。

SELECT * FROM TABLE_1 returns records as shown below

Field1
1
2
3
4

SELECT * FROM TABLE_2 returns

Field2  Field3
1            4
2            6
3            7 
4            8

如果我们想要获取 TABLE_2 的“Field3”中存在的 TABLE_1 中的数据,那么我们可以使用带有 IN 运算符的查询作为

SELECT * FROM TABLE_1
WHERE FIELD1 IN ( SELECT FIELD3 FROM TABLE_2)

我们也可以使用带有 EXISTS 的查询作为

SELECT * FROM TABLE_1
WHERE EXISTS(    SELECT ‘X’
FROM TABLE_2
WHERE TABLE_1.FIELD1 = TABLE_2.FIELD3
)

使用 EXISTS 时,始终使用子查询中的 where 子句来连接表。不这样做将导致从主表中获取所有记录。例如,如果我们考虑下面的查询

SELECT * FROM TABLE_1
WHERE EXISTS(    SELECT Field3
FROM TABLE_2

)

将从 TABLE_1 中获取所有记录并且与查询相同

SELECT * FROM TABLE_1

另一个区别在于性能(取决于在外部/内部查询中选择了哪个表)。EXISTS 的工作速度比 IN 快。您可以查看上述查询的性能计划以获取更多信息。

于 2013-11-08T23:56:01.723 回答