在返回错误值的SQL中添加DISTINCT子句
一点背景知识:我在一家有大量用户在excel中运行报表的公司工作。它们通常需要宏来比较两组数据。我的大部分工作涉及调整特定的更改报告宏。不漂亮,但它能支付账单 今天我有一个想法,将excel表格拉入vba中的ADODB对象,然后对该对象运行SQL。一切似乎都很顺利。。。但后来我遇到了奇怪的行为 这将返回表1中没有.Name的所有名称。它工作得很好,但有些名字出现过多次在返回错误值的SQL中添加DISTINCT子句,sql,performance,vba,excel,Sql,Performance,Vba,Excel,一点背景知识:我在一家有大量用户在excel中运行报表的公司工作。它们通常需要宏来比较两组数据。我的大部分工作涉及调整特定的更改报告宏。不漂亮,但它能支付账单 今天我有一个想法,将excel表格拉入vba中的ADODB对象,然后对该对象运行SQL。一切似乎都很顺利。。。但后来我遇到了奇怪的行为 这将返回表1中没有.Name的所有名称。它工作得很好,但有些名字出现过多次 SELECT a.Name FROM [Table1] AS a LEFT JOIN [Table2] AS b ON a.Na
SELECT a.Name FROM [Table1] AS a
LEFT JOIN [Table2] AS b
ON a.Name = b.Name
WHERE b.Name IS NULL
添加distinct子句:
SELECT DISTINCT a.Name FROM [Table1] AS a
LEFT JOIN [Table2] AS b
ON a.Name = b.Name
WHERE b.Name IS NULL
完全更改出现的名称。显示的内容是不同的,但在两个表中都有
我试着将其改写为一组,以替换不同的值,得到了相同的结果。我和当地的古鲁商量过了,没有结果。下一步是在这里安装一个真正的数据库来运行一些测试
不过我还是很困惑。我不确定这是否适用于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
)
使用外部联接:
SELECT DISTINCT a.Name FROM [Table1] AS a
LEFT outer JOIN [Table2] AS b
ON a.Name = b.Name
WHERE b.Name IS NULL
从评论中:
如果恰好有超过65536行,是否使用了正确的Excel 2007 Forwards连接字符串(其中提供程序为“Microsoft.ACE.OLEDB.12.0”)?如果对超过65K行的工作表使用旧的Excel 2003连接字符串(带有提供程序“Microsoft.Jet.OLEDB.4.0”),则会出现问题–barrowc
巴罗克搞定了。导致问题的是旧的连接字符串。因为我有超过64k行的数据,所以输出的行为异常。将Jet字符串替换为“Microsoft.ACE.OLEDB.12.0”修复了该问题。我在Excel中的一些简单表上尝试了这两种SQL语句,并从中获得了正确的输出。唯一的区别是,DISTINCT会像预期的那样抑制重复的行。在ADO连接定义中,是否使用IMEX=1来允许混合数据类型?@sten。它只是以不同的顺序返回名称。如果您希望结果按特定顺序排列,则需要一个
order by
子句。@barrowc我应该注意,我用一小部分值尝试了这个方法,并得到了正确的答案。生产组超过10的数千行。同样,它在任何集合上都不使用distinct,而使用distinct生成其他结果。@GordonLinoff这个问题与结果的顺序无关。正在返回不同的结果。如果有什么我可以补充以提高清晰度,请告诉我。当我重新登录时,我会这样做。如果您恰好有超过65536行,您是否使用了正确的Excel 2007 Forwards连接字符串(其中提供程序为“Microsoft.ACE.OLEDB.12.0”)?如果对超过65K行的工作表使用较旧的Excel 2003连接字符串(带有提供程序“Microsoft.Jet.OLEDB.4.0”),则问题往往会出现。我尝试了一种变体,明天我将再次尝试,可能是我第一次没有正确执行。在这种情况下,Outer不是有效的关键字。ADODB没有接受。很高兴它起作用了。有关详细的连接字符串信息,请参阅