这可能是个傻瓜,所以我会提前道歉。SQL Server Where [column] <>
说我有两个表:
| TABLE 1 | | TABLE 2 |
----------------- ---------------------
|RESULT | REASON| |ID | DESCRIPTION|
----------------- ---------------------
| 1 | NULL | | A | NO INTEREST|
| 2 | A | | B | CALL CLOSED|
| 2 | B | | C | DECEASED |
| 1 | NULL | ---------------------
-----------------
所以,REASON
只能有一个值,如果RESULT
为2。否则,它是NULL
。
现在假设我运行以下命令:
SELECT
t1.RESULT, t2.DESCRIPTION
FROM
[TABLE 1] t1 LEFT OUTER JOIN
[TABLE 2] t2 ON t1.RESULT = t2.ID
我们会得到如下:
------------------------
| RESULT | DESCRIPTION |
------------------------
| 1 | NULL |
| 2 | NO INTEREST |
| 2 | CALL CLOSED |
| 1 | NULL |
------------------------
现在我发现,如果我再加入一个WHERE子句,像这样:
SELECT
t1.RESULT, t2.DESCRIPTION
FROM
[TABLE 1] t1 LEFT OUTER JOIN
[TABLE 2] t2 ON t1.RESULT = t2.ID
WHERE
t2.DESCRIPTION <> 'CALL CLOSED'
我由于某种原因结束以下内容:
------------------------
| RESULT | DESCRIPTION |
------------------------
| 2 | NO INTEREST |
------------------------
添加where子句看起来会排除结果为1的所有记录,所有记录都带有NULL原因值/说明值。
我在这里错过了什么?
与'NULL'的任何比较产生“未定义”。所以'NULL ='CALL CLOSED'和'NULL <>'CALL CLOSED'都不是真的。如果你想包含NULL值,可以使用'<>'CALL CLOSED'或t2.DESCRIPTION IS NULL' –
,可能是因为左连接无法找到t2行来加入,所以无法进行比较。 – dcarneiro
与问题无关,但是您的意思是“ON t1.REASON = t2.ID'? –