需要使用内部联接SELECT调用上层SQL语句

需要使用内部联接SELECT调用上层SQL语句,sql,select,inner-join,Sql,Select,Inner Join,我使用的是普适SQL 10.3(我们称之为MS SQL,因为几乎所有的语法都是一样的),我有一个查询,可以使用他们的电子邮件地址作为重复密钥来查找重复的客户: SELECT arcus.idcust, arcus.email2 FROM arcus INNER JOIN ( SELECT arcus.email2, COUNT(*) FROM arcus WHERE RTRIM(arcus.e

我使用的是普适SQL 10.3(我们称之为MS SQL,因为几乎所有的语法都是一样的),我有一个查询,可以使用他们的电子邮件地址作为重复密钥来查找重复的客户:

SELECT arcus.idcust, arcus.email2
     FROM arcus 
          INNER JOIN (
               SELECT arcus.email2, COUNT(*) 
                    FROM arcus WHERE RTRIM(arcus.email2) != '' 
                         GROUP BY arcus.email2 HAVING COUNT(*)>1
          ) dt 
     ON arcus.email2=dt.email2
          ORDER BY arcus.email2";
我的问题是我需要对email2字段进行不区分大小写的搜索。我需要使用UPPER()来转换这些字段

我对如何在这个查询中执行UPPER()有点困惑。我尝试过各种组合,包括一种我认为肯定有效的组合:

 ... ON UPPER(arcus.email2)=UPPER(dt.email2) ...
。。。但那没用。它认为这是一个有效的查询,但它运行了很长时间,我最终放弃并停止了它

你知道如何在email2字段上进行上转换吗


谢谢

字符串的排序规则将决定SQL Server如何比较字符串。如果使用不区分大小写的格式存储数据,则在比较字符串“AAAA”和“AAAA”时,它们将相等。您可以在where子句中为您的电子邮件列放置一个对比的拉丁文1\u General\u CI\u AS

查看下面的链接,了解如何在sql查询中实现排序规则

查看讨论SQL中不区分大小写的搜索的内容。本质上,查询速度如此之慢的原因很可能是查询中无法使用任何当前表索引,因此数据库引擎必须执行完整的表扫描,可能需要多次

当想要比较大写版本(
UPPER(arcus.email2)
)时,
arcus.email2
上的索引是完全无用的,因为数据库引擎无法在索引中查找值(因为它们是不同的值!)

为了提高性能,您可以专门根据对字段应用
UPPER
的结果创建索引

CREATE INDEX IX_arcus_UPPER_email2
    ON arcus (UPPER(email2));

如果数据库设置为区分大小写,则内部查询必须考虑到这一点,才能按预期执行分组。如果它不区分大小写,那么就不需要高级函数

假设数据库区分大小写,可以尝试下面的查询。也许这会跑得更快

SELECT arcus.idcust, arcus.email2
 FROM arcus 
      INNER JOIN (
           SELECT UPPER(arcus.email2) as upperEmail2, COUNT(*) 
                FROM arcus WHERE RTRIM(arcus.email2) != '' 
                     GROUP BY UPPER(arcus.email2) HAVING COUNT(*)>1
      ) dt 
 ON UPPER(arcus.email2) = dt.upperEmail2          

这样做的伎俩和合理的时间!出于某种原因,我认为我必须在arcus.email2上的第一个SELECT上执行UPPER(),但显然不是这样。荣誉