Sql 如何对多个列执行Oracle(+;)左联接查询

Sql 如何对多个列执行Oracle(+;)左联接查询,sql,oracle,join,left-join,Sql,Oracle,Join,Left Join,我们正在使用Oracle 11。 当像下面这样执行左连接时,查询的结果是11053行 …LEFT JOIN LIQ ON LIQ.ID = SEC.ID AND LIQ.UPD_DT >= '08-JAN-19' WHERE … 但是,当使用(+)进行左连接时,查询的结果是10136行 ...FROM SEC, LIQ WHERE LIQ.ID (+)= SEC.ID AND LIQ.UPD_DT >= '08-JAN-19' 如何将(+)与多列一起使用 谢谢。简短的回答是只

我们正在使用Oracle 11。 当像下面这样执行左连接时,查询的结果是11053行

…LEFT JOIN LIQ ON LIQ.ID = SEC.ID AND LIQ.UPD_DT  >= '08-JAN-19'
WHERE …
但是,当使用(+)进行左连接时,查询的结果是10136行

...FROM SEC, LIQ
WHERE LIQ.ID (+)= SEC.ID AND LIQ.UPD_DT  >= '08-JAN-19'
如何将(+)与多列一起使用


谢谢。

简短的回答是只包含两个术语的
(+)

WHERE LIQ.ID (+) = SEC.ID AND LIQ.UPD_DT (+) >= '08-JAN-19'
尽管您似乎在使用字符串比较日期,但依赖于隐式转换和NLS设置;如果是,请将其转换或使用日期文字:

WHERE LIQ.ID (+) = SEC.ID AND LIQ.UPD_DT (+) >= DATE '2019-01-08'
但从“现代”(1992年后)的ANSI join语法到Oracle古老的专有语法的改变似乎是一件非常奇怪的事情。即使使用,也不要使用它们的语法:

Oracle建议您使用
FROM
子句
OUTER JOIN
语法,而不是Oracle JOIN运算符。使用Oracle联接运算符
(+)
的外部联接查询受以下规则和限制的约束,这些规则和限制不适用于
FROM
子句
外部联接
语法:

(尽管在他们的文档中仍然有很多代码示例,但没有帮助…)


ANSI语法曾经有一些错误,而且可能仍然很少出现您看到不同行为或无法使用新语法的情况;但是这不太可能,如果您有一个有效的查询,那么回归到旧方法似乎没有任何好处。

不要尝试-只需使用正确的连接语法即可。如果这样做行得通,为什么您希望恢复到古代的Oracle only语法,即使他们不建议您使用这种语法?原因是您在第二个查询中缺少第二个(+),因此您已有效地将第二个查询转换为内部联接。然而,正如亚历克斯所说,不要使用旧的风格;为了清晰和易于维护,请使用ANSI语法。实际上仍然存在边缘情况,当然在11g和12c中,ANSI 92语法会创建奇怪的执行路径,但是,它们是非常边缘的情况,我认为显式连接语法的清晰性大大超过了无效访问路径的风险。是的,我只是加了一张关于这个的便条(8-)谢谢大家!亚历克斯·普尔和博内斯特的回答解决了这个问题。我也不想在查询中使用(+),我更喜欢使用左连接语法。不幸的是,我需要将此查询放在其上的应用程序不理解左联接,因此我需要将所有联接放在WHERE子句中:(