在SQL中添加DISTINCT子句返回错误的值

时间:2015-06-25 19:25:22

标签: sql excel performance vba excel-vba

一些背景知识:我正在为一个拥有大量用户在excel中运行报表的组织工作。它们通常需要将两组数据相互比较的宏。我的大部分工作涉及调整特定的更改报告宏。不漂亮,但它支付账单。

我今天想知道将excel表拉入vba中的ADODB对象,然后针对该对象运行SQL。一切似乎都运作良好......但后来我发现了奇怪的行为。

这将返回table1中的所有名称,其中a.Name在表2中不是。它工作正常,但有些名字出现了多次。

SELECT a.Name FROM [Table1] AS a
LEFT JOIN [Table2] AS b
ON a.Name = b.Name
WHERE b.Name IS NULL

添加DISTNCT子句:

SELECT DISTINCT a.Name FROM [Table1] AS a
LEFT JOIN [Table2] AS b
ON a.Name = b.Name
WHERE b.Name IS NULL

完全更改显示的名称。显示的是DISTINCT,但存在于两个表中。

我尝试重新编写一个GROUP BY来替换不同的值并收到相同的结果。我和当地的大师一起检查过,没有在哪里。下一步是在这里安装一个真实的数据库来运行一些测试。

我虽然感到困惑。

3 个答案:

答案 0 :(得分:1)

来自评论:

  

如果碰巧有超过65,536行,您使用的是正确的Excel 2007以上连接字符串(提供程序是“Microsoft.ACE.OLEDB.12.0”)吗?如果您将旧的Excel 2003连接字符串(使用提供程序“Microsoft.Jet.OLEDB.4.0”)用于行超过65K的工作表,则会出现问题 - barrowc

barrowc钉了它。这是造成问题的旧连接字符串。由于我有超过64k行的数据,输出表现奇怪。将Jet字符串换成“Microsoft.ACE.OLEDB.12.0”解决了这个问题。

答案 1 :(得分:0)

我不确定这是否适用于vba中的ADODB对象,但我会在MySQL的SQL Server中执行以下操作...

如果我正确地阅读了您的问题,那么您正试图从表A中找到不在表B中的姓名。

SELECT DISTINCT a.Name 
FROM [Table1] AS a
WHERE a.Name not in (
           SELECT b.Name
           FROM [Table2] AS b
      )

答案 2 :(得分:0)

使用外部联接:

SELECT DISTINCT a.Name FROM [Table1] AS a
LEFT outer JOIN [Table2] AS b
ON a.Name = b.Name
WHERE b.Name IS NULL