繁体   English   中英

Excel中动态SQL查询的性能问题

[英]Performance Issue with dynamic SQL query in Excel

我想在Excel中为redshift / postgres DB创建一个动态SQL查询,以增强具有几列的元素的动态列表。

基本上,我希望能够将ID列表复制/键入到excel中,如下所示:

Id
------
AAC123
ABB203
AEF678
AEK232
BCE123
BFG304

理想情况下,SQL查询将使用如下语句:

select * 
from table 
where ID in ('AAC123', 'ABB203', 'AEF678', 'AEK232', 'BCE123', 'BFG304')

我设法使用以下方法在Power Query中创建一个使用一个属性的参数:https://exceleratorbi.com.au/pass-excel-parameter-power-query/

select * 
from table 
where ID = Parameter

当我将= ParameterIN Parameter交换时,出现以下错误:

表达错误令牌权

当我改用IN (Parameter) ,出现相同的错误。

我设法通过在Power查询中将两个表与内部联接合并来创建解决方法。 不幸的是,redshift / postgres中的表有1000万行,刷新25-100个项目通常需要5分钟。 没有动态SQL的同一查询仅需15秒。

有人建议我需要做些不同的事情吗?

将您的ID表加载到查询编辑器中,并将其转换为列表(“转换”>“转换为列表”)。 我假设您的表名为Table1

在查询表上,选择要过滤的任何单个ID值。 查询编辑器应使用类似于以下代码的代码生成一个步骤:

= Table.SelectRows(Source, each ([ID] = "AAC123"))

取而代之的是,让我们替换选择条件以使用Table1

= Table.SelectRows(Source, each List.Contains(Table1, [ID]))

如果在右侧的“应用步骤”部分中右键单击此步骤,然后选择“查看本机查询”,则应该看到该SQL查询具有WHERE子句,就像您在帖子中一样。

该“本机查询”是发送回服务器的内容,因此这将提高性能。


注意 :您不一定必须先转换为列表。 如果不将其转换为列表,则过滤步骤将改为如下所示(您使用列名):

= Table.SelectRows(Source, each List.Contains(Table1[ID], [ID]))

编辑:由于您在连接中使用SQL连接字符串,因此可以在此字符串的WHERE语句中包括ID列表:

query: = Odbc.Query("dsn=Redshift",
                    "select ID, column_A, column_B
                     from redshift.db.info
                     where ID in (" & Text.Combine(Table1[ID], ",") & ")")

Text.Combine函数连接ID列。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM