我正在使用SQL在HANA上编写脚本化计算视图。 寻找一些性能助推器替代我在while循环中实现的逻辑。代码的简化版本如下。
它试图在表B中为表A中的供应商提供类似的供应商。
请告诉我不准确的语法。
v = select vendor, vendorname from A;
while --set a counter here
vendorname = capture the record from v for row number represented by counter here
t = select vendor, vendorname from v where (read single vendor from counter row)
union all
select vendor, vendorname from B where contains(vendorname,:vendorname,fuzzy(0.3))
union all
select vendor, vendorname from t
endwhile
当两个表中有数千条记录时,此查询将终止。因此,在阅读了几篇博客后,我意识到我正在使用循环方向错误。
为了加快这一点,我遇到了一种名为CTE的东西。
当我尝试使用CTE实现相同的代码时,我不允许这样做。 我正在尝试编写的示例代码如下。任何人都可以帮我解决这个问题吗?系统不接受语法。
t = with mytab ("Vendor", "VendorName")
AS ( select "Vendor", "VendorName" from "A" WHERE ( "Updated_Date" >= :From_Date AND "Updated_Date" <= :To_Date ) )
select * from "B" WHERE CONTAINS ("VendorName", mytab."VendorName",FUZZY(0.3));
此语法的SQL错误是: SQL:无效的标识符:MYTAB
我想知道:
是否允许使用CTE进行此类操作。如果是,HANA SQL中的正确语法是什么?
如果不是,如何在不循环使用一个表的情况下实现所需的结果?
谢谢,
阿努普
答案 0 :(得分:0)
但是无论如何你在SQLScript上下文中,你也可以改用表变量。
我不确定的是,你究竟想做什么。如果可能,请提供您的使用方案说明。
好的,根据您的意见,以下方法可能适合您。
请注意,在我的示例中,我使用了USERS
系统表的副本,因此您必须使查询适合您的表。
do
begin
declare user_names nvarchar(5000);
select string_agg(user_name,' ') into user_names
from cusers
where user_name in ('SYS', 'SYSTEM');
select *
from cusers
where contains (user_name, :user_names, fuzzy(0.3));
end;
我在这里做的是获取我想要对变量user_names
进行模糊查找的所有潜在名称(用空格分隔)。为此,我使用STRING_AGG()
聚合函数
第一个语句完成后,:user_names
在我的示例中包含SYSTEM SYS
。
现在,CONTAINS
允许一次搜索多个列多个搜索字词(您可能需要在此处重新查看参考文档以获取详细信息),因此< / p>
CONTAINS (<column_name>, 'term1 term2 term3')
在列中查找所有三个术语。
我们将字符串SYS SYSTEM
提供给第二个查询和CONTAINS
子句。
这对我来说很好,避免了连接并且只能在表上运行一次。
顺便说一句:不知道你在哪里得到关于只读程序中表变量的说法 - 它是错误的。当然你可以使用表变量,事实上它建议使用它们。