Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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
Oracle:是否可以从两个不同的表中准确地联接空字段?_Oracle_Null_Left Join_Nvl - Fatal编程技术网

Oracle:是否可以从两个不同的表中准确地联接空字段?

Oracle:是否可以从两个不同的表中准确地联接空字段?,oracle,null,left-join,nvl,Oracle,Null,Left Join,Nvl,我有四个字段——itemnum、storeloc、binnum和quantity 我试图选择前三个字段匹配的数据,但binnum有时为空。当我对数量执行求和时,由于binnum为空,计算结果不正确。数据库有一个索引,其中只能有一个itemnum、storeloc和binnum组合,其中binnum可以为NULL。我意识到允许密钥具有空数据是一种不好的做法,但我无法控制数据的结构 我尝试了以下where条款: where nvl(b.binnum,0) = nvl(mu.binnum,0) wh

我有四个字段——itemnum、storeloc、binnum和quantity

我试图选择前三个字段匹配的数据,但binnum有时为空。当我对数量执行求和时,由于binnum为空,计算结果不正确。数据库有一个索引,其中只能有一个itemnum、storeloc和binnum组合,其中binnum可以为NULL。我意识到允许密钥具有空数据是一种不好的做法,但我无法控制数据的结构

我尝试了以下where条款:

where nvl(b.binnum,0) = nvl(mu.binnum,0)

where b.binnum is null and mu.binnum is null

两者都不起作用。有什么建议吗?

使用
NVL
连接可能具有
NULL
值的字段是执行此操作的典型方法。使用此类查询:

WHERE b.itemnum = mu.itemnum
  AND b.storeloc = mu.storeloc
  AND NVL(b.binnum, 0) = NVL(mu.binnum, 0)
假设两个表中都没有实际具有
binnum
0
的行。如果不是这样的话,总数将被扣除。您将加入具有
0
值的
binnum
和具有
NULL
值的
binnum
。需要选择一个默认值进行比较,根据域定义,您知道该值永远不会存在。即如果
binnum
NULL
或大于
0

WHERE b.itemnum = mu.itemnum
  AND b.storeloc = mu.storeloc
  AND NVL(b.binnum, -1) = NVL(mu.binnum, -1)

当前三个字段匹配时…什么?你好像有两张桌子。这将有助于查看您的表结构和整个查询。我有两个表。当第一个字段匹配且binnum不为NULL时,总和计算工作正常。这个问题有点冗长,所以我更喜欢一般性的建议,但如果你真的想看的话,我可以发布。谢谢你的回答。我明天会在工作中试试你的建议为什么我觉得NVL只能用一个数字来代替我也能用绳子吗?使用数字和字符串有什么优点或缺点?字符串可以连接到字段吗?如果一个表返回一个值(一个数字),而您的NVL子句返回一个字符串,会发生什么情况?然后您将比较两种不同的类型。在比较类型时确保一致性更安全。对不起,我应该在前面声明BINNUM是一个VARCHAR2字段。binnum中的NUM有误导性。然后比较varchars:
NVL(b.binnum',!NULL\u BIN\u compare!')=NVL(mu.binnum',!NULL\u BIN\u compare!')
谢谢。当我对binnum进行计数,其中binnum类似于“0%”,我发现了38行。这可能是造成问题的原因。。。但我想我也收到了一个写得很糟糕的问题。我使用sub-selects而不是group-by重写,现在您的NVL(b.binnum,!NULL_-BIN_-COMPARE!')=NVL(mu.binnum,!NULL_-BIN_-COMPARE!')按预期工作。