SQL没有返回正确的值

SQL没有返回正确的值,sql,oracle11g,Sql,Oracle11g,因此,我有一个简单的SQL查询,但它似乎有问题,或者我的where子句写错了,因为如果我在特定字段上选择特定值为50的matflag,它不会返回值 查询基本上是从表1中选择的,在表2中有一个子查询,其中where子句只检查子查询返回的字段是否存在于表1中: 这将返回以下输出: +----------+---------+---------+ | MATNUM | MATFLAG | FACTORY | +----------+---------+---------+ | 60000000 |

因此,我有一个简单的SQL查询,但它似乎有问题,或者我的where子句写错了,因为如果我在特定字段上选择特定值为50的matflag,它不会返回值

查询基本上是从表1中选择的,在表2中有一个子查询,其中where子句只检查子查询返回的字段是否存在于表1中:

这将返回以下输出:

+----------+---------+---------+
| MATNUM   | MATFLAG | FACTORY |
+----------+---------+---------+
| 60000000 |         | 001000  |
| 60000000 |         | 002000  |
| 60000000 |         | 003000  |
| 60000000 |         | 004000  |
| 60000000 |         | 005000  |
+----------+---------+---------+
+----------+---------+---------+
| MATNUM   | MATFLAG | FACTORY |
+----------+---------+---------+
| 60000000 |         | 001000  |
+----------+---------+---------+
.... and so on, have a look at the first table above
但是,如果我添加和t1.matflag!='在where子句末尾50'处,整个输出消失

Select distinct 
    t1.matnum as matnum, t1.matflag as matflag, t1.factory as factory 
from 
    table1 t1, 
    (select matnum from table2 where technical_value = 'XX') t2 
where 
    t1.matnum = t2.matnum 
    and t1.matnum = '60000000' 
    and t1.matflag != '50';
输出:

+----------+---------+---------+
| MATNUM   | MATFLAG | FACTORY |
+----------+---------+---------+
列matflag的附加信息:它是一个varchar22 Char列,要么不填充任何内容,要么填充值“50”,要么填充值“10”或“20”。 现在,如果我更改where子句from和t1.matflag!='50'to和t1.matflag为空,输出再次正确:

Select distinct 
    t1.matnum as matnum, t1.matflag as matflag, t1.factory as factory 
from 
    table1 t1, 
    (select matnum from table2 where technical_value = 'XX') t2 
where 
    t1.matnum = t2.matnum 
    and t1.matnum = '60000000' 
    and t1.matflag is null;
这将返回这个输出:

+----------+---------+---------+
| MATNUM   | MATFLAG | FACTORY |
+----------+---------+---------+
| 60000000 |         | 001000  |
| 60000000 |         | 002000  |
| 60000000 |         | 003000  |
| 60000000 |         | 004000  |
| 60000000 |         | 005000  |
+----------+---------+---------+
+----------+---------+---------+
| MATNUM   | MATFLAG | FACTORY |
+----------+---------+---------+
| 60000000 |         | 001000  |
+----------+---------+---------+
.... and so on, have a look at the first table above
那么,如果我选择on为空,但如果我选择on则不返回,它将如何返回内容!='50'? 旁注:正在更改!=我也帮不上忙

matflag为null时如何应用,但matflag!='50英尺不是吗


我们运行Oracle Database 11g 11.2.0.3.0版-64位产品。

了解如何使用正确的显式联接语法:

然后了解空值以及它们如何在几乎每次比较中失败,包括

您想要的逻辑是:

where t2.technical_value = 'XX' and t1.matnum = '60000000' and
      (matflag <> '50' or matflag is null)

在SQL中,NULL表示未知值,因此任何使用它的操作都将导致NULL。请尝试COALESCEt1.matflag,0 50…

在SQL中,NULL表示未知值,因此,对它的操作将导致NULL,这被布尔化为FALSE…您好,Gordon,我可能应该在问题中添加这一点,我已经使用了一个简单的连接,我只是对其他事情感兴趣,这对我帮助很大,谢谢!我将更深入地了解空值,只是直到现在才想到我会需要它。谢谢,有趣的尝试!不过,我想我会坚持戈顿的尝试,现在我知道为什么我的比较失败了。向上投票!