[英]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
当我将= Parameter
与IN 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.