一些背景知识:我正在为一个拥有大量用户在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来替换不同的值并收到相同的结果。我和当地的大师一起检查过,没有在哪里。下一步是在这里安装一个真实的数据库来运行一些测试。
我虽然感到困惑。
答案 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