在案例DB2 SQL中使用JOIN

时间:2014-10-20 16:51:43

标签: sql vba db2

所以我正在尝试使用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"

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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