2017-04-05 213 views
0

我正在使用SQL在HANA上編寫腳本計算視圖。 尋找我在while循環中實現的邏輯的一些性能提升替代品。代碼的簡化版本如下。HANA SQL CTE where條件

它試圖從表A獲得廠商表B中尋找類似的廠商

請原諒不準確的語法。

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. 如果否,我如何在不循環一張表的情況下實現所需的結果?

感謝,

阿努普

回答

0

CTE的被允許在SAP HANA - 你可能要檢查的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允許一次搜索多個搜索字詞多列(您可能要重新檢查這裏詳細的參考文檔),所以

CONTAINS (<column_name>, 'term1 term2 term3') 

查找在所有三個方面列。

隨着我們養活串SYS SYSTEM進入第二查詢和CONTAINS條款。

這對我來說工作正常,避免了一起,並運行在被搜索一次表。

BTW:不知道你在哪裏得到關於從只讀程序表變量聲明 - 這是錯的。當然你可以使用表變量,實際上建議使用它們。

+0

謝謝拉爾斯。在新查詢中,** mytab。「VendorName」**的語法不正確。我想知道CTE是否允許在哪種情況下使用mytab字段。在功能上,所有我尋找從表A到模糊搜索(這意味着在表A中的每個條目表B中多於一個的結果)一個VLOOKUP成表B和從表B中的結果與表A中的每個條目映射。你能請教如何在沒有while循環的情況下做到這一點? –

+0

就*表變量*而言,這些不能用於像計算視圖這樣的「只讀」過程。即使有**表變量**,我也懷疑我是否可以在不使用循環的情況下完成我的場景。那麼提高性能的最好方法是什麼? –

+0

謝謝,這有助於部分解決,但採用這種方法我無法將搜索結果映射到特定用戶。比方說,有兩種結果(SY和SYST)匹配SYS,和一個結果(系統)匹配系統,都讓我有此查詢得到的是SY,SYST和系統。但我無法映射哪一個匹配哪一個,除非我循環**:user_names **中的用戶。 –