2014-10-20 77 views
0

所以我正在嘗試使用CASE來嘗試生成報告,但我被卡住了。在案例中使用JOIN DB2 SQL

我想要做的是拿一個項目列表(ITEM),並從其他表中添加信息。如果某一列中有價值,則需要從另一個表格(PRICE)中提取價格;否則,它需要使用ITEM上的價格。我曾嘗試多種變化無濟於事,但這是最新的:

sqlStr = "SELECT i.IMFGR || i.ICOLOR || i.IPATT Item, i.INAME Description1, i.INAME2 Description2, i.IUNITS UM, " _ 
     & "i.IPRCCD PClass, i.ICSTCD CClass, i.IPACCD Pack, " _ 
     & "CASE " _ 
      & "WHEN (i.IPRCCD != '') THEN (SELECT p.$LIST FROM DB.PRICE p " _ 
                & "LEFT JOIN DB.ITEM i " _ 
                & "ON p.$PRCCD = i.IPRCCD) " _ 
      & "ELSE (i.ILIST) "_ 
      & "END AS PRICE " _ 
     & "FROM DB.ITEM i " _ 
     & "WHERE (i.IMFGR = '" & man & "') " _ 
     & "ORDER BY i.IMFGR || i.ICOLOR || i.IPATT" 
+0

貴柱IPRCCD值爲空,那麼你還需要時使用(i.IPRCCD不是null,i.iprccd!=「」) – radar 2014-10-20 18:01:13

+0

給了一個嘗試過,我仍然得到一個ODBC錯誤。運行時錯誤'1004'。 – sockpuppet 2014-10-20 18:03:51

+0

你可以發佈表格的樣本數據嗎? – radar 2014-10-20 18:13:36

回答

1

你再選擇

(SELECT p.$LIST FROM DB.PRICE p 
LEFT JOIN DB.ITEM i 
ON p.$PRCCD = i.IPRCCD) 

回報從表DB.PRICE所有行 - 顯然,它不能被分配在一個單一的價值是期待。很顯然,你的意圖是要關聯起來子選擇外選擇:

(SELECT p.$LIST FROM DB.PRICE p 
WHERE p.$PRCCD = i.IPRCCD) 

假設返回每個i.IPRCCD一條記錄。這樣做的一個更好的方法是完全避免子選擇:

"SELECT i.IMFGR || i.ICOLOR || i.IPATT Item, i.INAME Description1, i.INAME2 Description2, i.IUNITS UM, " _ 
    & "i.IPRCCD PClass, i.ICSTCD CClass, i.IPACCD Pack, " _ 
    & "CASE " _ 
     & "WHEN (i.IPRCCD != '') THEN (p.$LIST) " _ 
     & "ELSE (i.ILIST) "_ 
     & "END AS PRICE " _ 
    & "FROM DB.ITEM i " _ 
    & "LEFT OUTER JOIN DB.PRICE p " _ 
    & "ON p.$PRCCD = i.IPRCCD " _ 
    & "WHERE (i.IMFGR = '" & man & "') " _ 
    & "ORDER BY i.IMFGR || i.ICOLOR || i.IPATT" 
+0

太棒了!我首先嚐試了你的最後一個建議,它完全符合我的要求。謝謝! – sockpuppet 2014-10-20 18:56:55

1

我做了類似的事情來獲得區域定價。你是否考慮過在主要部分進行加入?它會避免兩次檢查DB.ITEM表。這是我的頭頂,沒有經過檢驗。我將其簡化爲SQL語句,並將其重新格式化爲我自己的可讀性,因此請確保適應您的需求。

SELECT i.IMFGR || i.ICOLOR || i.IPATT Item 
    ,i.INAME Description1 
    ,i.INAME2 Description2 
    ,i.IUNITS UM 
    ,i.IPRCCD PClass 
    ,i.ICSTCD CClass 
    ,i.IPACCD Pack 
    ,CASE 
     WHEN (i.IPRCCD = '') THEN 
      i.ILIST 
     ELSE /* i.IPRCCD is not empty, so */ 
      /*Use p.$LIST if not null. Otherwise, use i.ILIST*/ 
      COALESCE(p.$LIST, i.ILIST) 
    END AS PRICE 
FROM DB.ITEM i 
    ,DB.PRICE p 
WHERE 
    (i.IMFGR = '" & man & "') 
    AND (
     i.IPRCCD = '' 
     OR p.$PRCCD = i.IPRCCD 
    ) 
ORDER BY i.IMFGR || i.ICOLOR || i.IPATT 
+0

Mustaccio打敗了我。猜猜這就是當我被拉走時發生的事情,當我回來時不刷新。 – mhester 2014-10-20 18:57:52