Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在db2sql中使用JOIN_Sql_Vba_Db2 - Fatal编程技术网

在db2sql中使用JOIN

在db2sql中使用JOIN,sql,vba,db2,Sql,Vba,Db2,所以我正在尝试用CASE来生成一份报告,我被卡住了 我试图做的是获取一个项目列表(ITEM),并将其他表中的信息添加到其中。如果某一列中有一个值,则需要从另一个表中提取价格(价格);否则,它需要使用商品上已有的价格。我尝试了许多变化,但都没有效果,但这是最新的: sqlStr = "SELECT i.IMFGR || i.ICOLOR || i.IPATT Item, i.INAME Description1, i.INAME2 Description2, i.IUNITS UM, " _

所以我正在尝试用CASE来生成一份报告,我被卡住了

我试图做的是获取一个项目列表(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

如果您的列IPRCCD有空值,那么您还需要在(i.IPRCCD不为空且i.IPRCCD!='')也尝试了一次,但仍然出现ODBC错误时使用。运行时错误“1004”。您可以发布表的示例数据吗?太棒了!我先尝试了你最后的建议,它正是我想要的。非常感谢。穆斯塔西奥比我先到。我想这就是当我被拉走,回来时不刷新时发生的事情。