db2 我应该为此使用SQL完全外部连接吗?

eeq64g8w  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(169)

请考虑下列表格:
表A:

DOC_NUM
DOC_TYPE
RELATED_DOC_NUM
NEXT_STATUS
...

表B:

DOC_NUM
DOC_TYPE
RELATED_DOC_NUM
NEXT_STATUS
...

DOC_TYPENEXT_STATUS列在这两个表中有不同的含义,尽管NEXT_STATUS = 999在这两个表中都表示“关闭”。此外,在某些情况下,每个表中都有一条记录,该记录引用另一个表中的相应条目(即RELATED_DOC_NUM列)。
我正在尝试创建一个查询,该查询将从满足以下条件的两个表中获取数据:

A.RELATED_DOC_NUM = B.DOC_NUM
A.DOC_TYPE = "ST"
B.DOC_TYPE = "OT"
A.NEXT_STATUS < 999 OR B.NEXT_STATUS < 999

A.DOC_TYPE = "ST"表示将库存从一个工厂转移到另一个工厂的转移订单。B.DOC_TYPE = "OT"表示接收工厂对转移库存的相应接收。
我们希望从任何一个表中获取记录,其中有一个ST/OT对,其中一个或两个条目关闭(即NEXT_STATUS < 999)。
我假设我需要使用一个完全外部连接来完成这个任务。如果这是错误的假设,请让我知道我应该做什么。

更新(2021年11月30日):

我相信@Caius Jard是正确的,因为它不需要是一个外连接。应该总是有一个ST/OT对。
我已经写了我的查询如下:

SELECT <columns>
FROM A LEFT JOIN B
ON
    A.RELATED_DOC_NUM = B.DOC_NUM
WHERE
    A.DOC_TYPE IN ('ST') AND
    B.DOC_TYPE IN ('OT') AND
    (A.NEXT_STATUS < 999 OR B.NEXT_STATUS < 999)

这有道理吗?

更新2(2021年11月30日):

实际上,这些是JD Edwards ERP应用程序正在使用的DB2数据库表。我所知道的查看表定义的唯一方法是使用网站http://www.jdetables.com/,输入表ID并按回车键运行搜索。返回的是关于表及其列的大量信息。
表A实际上是F4211,表B实际上是F4311
现在,我已经简化了查询,以保持它的简单性,并将变量保持在最少。这是我目前拥有的:

SELECT CAST(F4211.SDDOCO AS VARCHAR(8)) AS SO_NUM,
       F4211.SDRORN AS RELATED_PO,
       F4211.SDDCTO AS SO_DOC_TYPE,
       F4211.SDNXTR AS SO_NEXT_STATUS,
       CAST(F4311.PDDOCO AS VARCHAR(8)) AS PO_NUM,
       F4311.PDRORN AS RELATED_SO,
       F4311.PDDCTO AS PO_DOC_TYPE,
       F4311.PDNXTR AS PO_NEXT_STATUS
FROM   PROD2DTA.F4211 AS F4211
       INNER JOIN PROD2DTA.F4311 AS F4311
         ON F4211.SDRORN = CAST(F4311.PDDOCO AS VARCHAR(8))
WHERE  F4211.SDDCTO IN ( 'ST' )
       AND F4311.PDDCTO IN ( 'OT' )

故事的另一部分是,我正在使用一个报表包,它允许您定义数据的“虚拟”视图。虚拟视图允许报表开发人员指定要使用的SQL。这是我正在使用SQL的应用程序。当我设置SQL时,必须执行一个验证步骤。如果验证了SQL,它将返回一组有限的结果。
当我输入上面的查询并验证它时,它说没有结果,这毫无意义。我猜测是数据转换导致了这个问题,但不确定。

更新3(2021年11月30日):

故事的另一个转折。相关的文档编号不仅被定义为字符串值,而且它包含前导零。这在两个表中都是正确的。主文档编号(在两个表中)被定义为数字值,因此没有前导零。我不知道为什么那些开发JDE的人会这样做,但这就是存在的。
因此,在两个表之间有***条符合条件的匹配记录,但我认为我没有得到任何结果,因为当我将数字转换为字符串时,它并不匹配,因为一个值是,比如说"12345",而另一个是"00012345"
我可以在做相等检查之前用零填充数字-〉字符串值吗?

更新4(2021年12月2日):

通过将数字文档编号转换为左零填充的字符串,最终能够使查询工作。

SELECT <columns>
FROM   PROD2DTA.F4211 AS F4211
       INNER JOIN PROD2DTA.F4311 AS F4311
         ON F4211.SDRORN = RIGHT(CONCAT('00000000', CAST(F4311.PDDOCO AS VARCHAR(8))), 8)
WHERE  F4211.SDDCTO IN ( 'ST' )
       AND F4311.PDDCTO IN ( 'OT' )
       AND ( F4211.SDNXTR < 999
              OR F4311.PDNXTR < 999 )
wztqucjr

wztqucjr1#

您应该编写如下查询:

SELECT <columns>
FROM A INNER JOIN B
ON
    A.RELATED_DOC_NUM = B.DOC_NUM
WHERE
    A.DOC_TYPE IN ('ST') AND
    B.DOC_TYPE IN ('OT') AND
    (A.NEXT_STATUS < 999 OR B.NEXT_STATUS < 999)

LEFT联接是一种OUTER联接; LEFT JOIN通常是LEFT OUTER JOIN的缩写)。OUTER表示“由于没有匹配项,因此一端可能在每列中都有空值”。最重要的是,问题中发布的代码(具有LEFT JOIN,但随后具有WHERE some_column_from_the_right_table = some_value)作为INNER连接运行,因为由LEFT OUTER进程插入的任何空值随后都会被WHERE子句取消

s3fp2yjn

s3fp2yjn2#

有关如何解决“数据转换或Map”错误的详细信息,请参阅Update 4。

相关问题