Oracle:是否可以从两个不同的表中准确地联接空字段?
我有四个字段——itemnum、storeloc、binnum和quantity 我试图选择前三个字段匹配的数据,但binnum有时为空。当我对数量执行求和时,由于binnum为空,计算结果不正确。数据库有一个索引,其中只能有一个itemnum、storeloc和binnum组合,其中binnum可以为NULL。我意识到允许密钥具有空数据是一种不好的做法,但我无法控制数据的结构 我尝试了以下where条款: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
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!')按预期工作。