2014-01-12 71 views
0

我有一個選擇查詢,以獲得一個結果集,我的查詢如下:有Select查詢聯接條件錯誤

SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", 
CASE 
    WHEN T4."REFID" IS NOT NULL 
    THEN T4."REFID" 
END AS "result" 
FROM "SYSTEM"."T00_SOFT" T0 
LEFT OUTER JOIN 
(
SELECT T1."REFID", T1."REFID_NR", T1."ID_POS",T1."ARTIKEL" ,T2."VEHW", T2."VNHW" , 
(((T2."VEHW"*100)/(T2."VNHW"))*((T1."ER_AW"*100)))/(T1."BAS_AW") AS "claims" 
FROM "SYSTEM"."T00_SOFT" T1 
INNER JOIN "SYSTEM"."T00_EG" T2 
ON T1."REFID" = T2."REFID" 
AND T1."ORGID_WE" = T2."ORGID" 
AND T1."ARTIKEL" = T2."MATNR") T4; 

當我執行查詢,我得到了以下錯誤:

Could not execute 'SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", CASE WHEN T4."REFID" IS NOT NULL THEN ...' in 42 ms 382 µs . 
SAP DBTech JDBC: [257] (at 521): sql syntax error: line 15 col 33 (at pos 521) 

這裏第15行是指最後一行,表示錯誤存在於T4。我沒有發現任何遺漏。如果有人可以建議什麼是gthe問題?

感謝

+1

在THEN語句中,你需要一些字段名稱在T4後面,你可以在那裏引用一個別名... – Sparky

+0

@Sparky你的意思是這樣的嗎?如果是這樣,它仍然不能解決問題。 –

+0

@Strawberry能否請你用蹩腳的詞語來解釋,以便更好地理解? –

回答

2

你在你的T0和T4之間的連接丟失的ON標準。我會重新將您的查詢修改爲:

SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", 
CASE 
    WHEN T4."REFID" IS NOT NULL 
    THEN T4."REFID" 
END AS "result" 
FROM "SYSTEM"."T00_SOFT" T0 
LEFT OUTER JOIN 
    (
    SELECT T1."REFID", T1."REFID_NR", T1."ID_POS",T1."ARTIKEL" ,T2."VEHW", T2."VNHW" , 
    (((T2."VEHW"*100)/(T2."VNHW"))*((T1."ER_AW"*100)))/(T1."BAS_AW") AS "claims" 
    FROM "SYSTEM"."T00_SOFT" T1 
     INNER JOIN "SYSTEM"."T00_EG" T2 
      ON T1."REFID" = T2."REFID" 
       AND T1."ORGID_WE" = T2."ORGID" 
       AND T1."ARTIKEL" = T2."MATNR") T4 
    ON T0."REFID" = T4."REFID" 

您已經加入了T0和T4而未描述它們之間的關係。請記住,僅僅因爲您在From子句中的子查詢中定義了TOO_SOFT和TOO_EG的關係並不意味着T0和T4是如何相關的。根據我發現的參考手冊here,連接標準總是需要左和右外連接。

此外,我會毫不猶豫地使用沒有Else語句的Case語句,因爲如果情況不是true,那麼它將返回NULL。如果這就是你想要的,那很好,但是我懷疑你會從另一個編程中受益,而不是完全放棄Else的陳述。

+0

和取決於數據類型,你可以做整數運算,這可能不是你想要的。 – HLGEM

+0

克里斯托弗多數完美! –

+0

很高興聽到它!謝謝你給它答案! –

0
SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", 
CASE 
    WHEN T4."REFID" IS NOT NULL 
    THEN T4."REFID"  ---<-- T4 is a Table Alias you need to mention 
END AS "result"    -- the column name as well like T4.ColumnName 

如果要針對可能的空值在列中只檢查您可以使用ISNULL功能,並提供一個替代值,如果返回值是零。

是這樣的....

SELECT T0."REFID" 
     , T0."REFID_NR" 
     , T0."ID_POS" 
     , IFNULL(T4."REFID",'Sub_Value') AS "Result" 
+0

@Ali對不起,現在它說''正確的語法附近'AS「'' –

+0

什麼你想在你的病例陳述?你想'選擇T4。「REFID」當T4。「REFID」不是空'??? –

+0

那麼,我只是檢查列T4。「REFID」是否爲空,然後選擇T4(我執行選擇查詢並保留結果集在表T4中)。 –