HANA SQL CTE在哪里条件

时间:2017-04-05 14:38:17

标签: loops common-table-expression hana

我正在使用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

我想知道:

  1. 是否允许使用CTE进行此类操作。如果是,HANA SQL中的正确语法是什么?

  2. 如果不是,如何在不循环使用一个表的情况下实现所需的结果?

  3. 谢谢,

    阿努普

1 个答案:

答案 0 :(得分:0)

SAP HANA允许使用CTE - 如果您正在寻找语法,可能需要查看HANA SQL参考。

但是无论如何你在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子句。

这对我来说很好,避免了连接并且只能在表上运行一次。

顺便说一句:不知道你在哪里得到关于只读程序中表变量的说法 - 它是错误的。当然你可以使用表变量,事实上它建议使用它们。