我正在研究两个表的问题 . 充电和充电历史 . 我想显示两个表中的列的选择,其中ChargeHistory中的匹配行具有与Charge不同的值和/或日期,或者如果ChargeHistory中根本没有匹配的条目 .
我使用的是使用ansi标准声明的左外连接,虽然它确实显示了正确的行,但是它没有显示空条目 .
我已经读过,如果您使用WHERE子句以及ON子句,有时会出现问题 . 但是,当我尝试将所有条件放在ON子句中时,查询花费的时间太长> 15分钟(这么长时间我刚刚取消了运行) .
更糟糕的是,两个表都使用三部分复合键 .
有没有人有任何关于为什么遗漏空值的想法?
SELECT values...
FROM bcharge charge
LEFT OUTER JOIN chgHist history
ON charge.key1 = history.key1 AND charge.key2 = history.key2 AND charge.key3 = history.key3 AND charge.chargeType = history.chargeType
WHERE charge.chargeType = '2'
AND (charge.value <> history.value OR charge.date <> history.date)
ORDER BY key1, key2, key
5 回答
您可能希望显式选择空值:
您可以在
where
中明确查找匹配项 . 我建议查看用于join
的其中一个键:表达式
charge.value <> history.value
将left outer join
更改为inner join
,因为NULL
结果将被过滤掉 .看看这个网站,它将对您非常有帮助,所有连接语句的可视化插图与代码示例
blog.codinghorror.com
Quoted of the relevant info in the above link:
Sample output:
Left outer join
表A中生成一组完整的记录,表B中有匹配的记录(如果可用) . 如果没有匹配,则右侧将包含null
WHERE
子句过滤连接返回的数据 . 因此,当您的内部表具有特定列的空数据时,相应的行将根据您指定的条件进行过滤 . 这就是为什么你应该将该逻辑转移到ON
子句 .对于性能问题,您可以考虑在用于连接和过滤的列上添加索引 .
对于
where clause
中使用的外连接表中的任何字段,您还必须为该相同字段允许IS NULL
选项,否则您将取消外连接的效果,结果与使用内连接时的结果相同 .编辑:看来这是上面Rene使用的相同查询结构,所以请将此视为支持 .