簡體   English   中英

在Case DB2 SQL中使用JOIN

[英]Using JOIN Within Case DB2 SQL

因此,我正在嘗試使用CASE嘗試生成報告,但被困了。

我想要做的是獲取項目列表(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"

您的子選擇

(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"

我做了類似的事情來獲得區域定價。 您是否考慮過加入主體? 這樣可以避免兩次檢查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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM