使用IN和EXISTS的结果不同

时间:2014-09-29 21:29:40

标签: sql

我有一个让我适合的查询。基本上我想要一个左外连接,但不使用连接。

我开始使用IN并返回了大约13,000行。如果我使用EXISTS,那么我会得到大约11,000行。即使我使用GROUP BY来确保重复项不计算在内,仍然存在差异。

这是一些代码

这个存在

SELECT upper(EMAIL_ADDRESS)
FROM DATA.CRM_CONTACTS
WHERE EXISTS
  (
  SELECT upper(Email_address)
  FROM DATA.MMBI
  WHERE DATA.CRM_CONTACTS.Email_address = DATA.MMBI.Email_Address
  )
group by 1
order by 1

这是使用IN的代码:

SELECT upper(EMAIL_ADDRESS)
FROM DATA.CRM_CONTACTS
WHERE upper(EMAIL_ADDRESS)  IN
  (
  SELECT upper(Email_address)
  FROM DATA.MMBI
  )
  group by 1
order by 1

有什么理由可以解释为什么我会得到不同的结果?

1 个答案:

答案 0 :(得分:2)

假设您正在使用SQL Server:

在您的in案例中,您进行了不区分大小写的比较,将两个值进行大写以进行比较:

WHERE upper(EMAIL_ADDRESS)  IN ( SELECT upper(Email_address)
                                     FROM DATA.MMBI
                                   )

exists案例中,相关子查询的连接条件为

WHERE DATA.CRM_CONTACTS.Email_address = DATA.MMBI.Email_Address

这意味着它将在游戏中使用排序规则进行比较,这可能是区分大小写的。