2016-06-13 74 views
1

的SAP SQL轉換器給了我這個作爲輸出:相當於沒有頂部或ORDER子查詢通過HANA SQL

SELECT c."id", c."key_link", 
    (SELECT TOP 1 "notes_extra" 
    FROM "Orders" c2 
    WHERE c2."id" = c."id" AND c2."start" < c."start" 
    ORDER BY c2."start" DESC) AS "previous_notes" 
FROM "Orders" c 
ORDER BY c."id"; 

不幸的是,SAP HANA SPS 10不接受它:
SAP DBTech JDBC: 309]:相關的子查詢不能有TOP或ORDER BY

我很努力地將查詢轉換成沒有TOP和ORDER BY的東西。嘗試了一些事情WHERE "start" = (SELECT MAX("start")但由於「開始」可以有重複的值,我結束了:SAP DBTech JDBC:[305]:單行查詢返回不止一行

那麼什麼是在正確的對等HANA SQL?

編輯:
它似乎增加了問題,「notes_extra」列的類型是NCLOB。我試圖想出的任何替代方法都會在此列上的集合函數(MAX,FIRST_VALUE,...)中的某處結束,結果如下:SAP DBTech JDBC:[264]:無效數據類型:LOB輸入聚合函數

回答

1

「我不在乎」是不是數據庫擅長處理。如果沒有選擇實際決定採用哪一行,那麼數據模型根本不適合回答這個問題。

select "id", "notes_extra" from 
    (SELECT c."id", c."notes_extra" 
      , row_number() over 
       (partition by c."id" 
       ORDER BY c."id" asc , c."start" desc) as RN 
     FROM orders c) 
    where rn =2; 

可以根據一般排序提供第二個最後的訂單註釋。請注意,這會提供與初始查詢相同的默認打破平局行爲,即:任意。

0

如果按給定排序順序只查看「第一個」列,則始終可以使用max()/ min()聚合。不知道你遇到了什麼問題,但這絕對是可能的。 但是,爲了您的要求,我會推薦在SQL視圖中實現邏輯(並將其與主查詢結合使用)或作爲表格udf。

+0

'WHERE c2。「start」=(SELECT MAX(c3。「start」)FROM「Orders」c3)'這可能會返回多行,因爲有多行具有相同的max「start」值,添加其他條件。這會導致錯誤消息,因爲對於選擇列表,只能返回一個結果行。我在我原來的問題中添加了錯誤信息。 – Hannobo

+0

很明顯,你需要一個tiebreaker來解決這個問題。如果有多個記錄被返回,哪一個必須被記錄? 如果您的初始代碼已經工作,那將是未定義的。 –

+0

拉爾斯:沒錯。那麼,如果我真的不在乎,我怎麼能挑選哪一個?見上面的編輯。 – Hannobo

2

你不需要一個子選擇可言,使用window function代替:

SELECT c."id", c."key_link", 
     lag(c."notes_extra") over (partition by c."id" order by c."start" desc) as "previous_notes" 
FROM "Orders" c 
ORDER BY c."id"; 
+0

有趣!不幸的是,在我的情況下,「notes_extra」不適合:「SAP DBTech JDBC:[264]:無效的數據類型:」C.notes_extra「不能使用LOB類型的」previous_notes「 - 也不包括所有的GROUP BY 「notes_extra」方法。 :\ – Hannobo