R V*_* OL 3 sql left-join sybase-ase
我需要帮助才能理解这个问题,下面两个查询之间有什么区别,我知道它们不会返回相同的结果.
SELECT a.col1, b.c1
FROM A a
LEFT JOIN B b
ON a.col1 = b.c1
WHERE b.status = 'Y'
Run Code Online (Sandbox Code Playgroud)
和
SELECT a.col1, b.c1
FROM A a, B b
WHERE a.col1 *= b.c1
AND b.status = 'Y'
Run Code Online (Sandbox Code Playgroud)
第一个查询:
SELECT
a.col1, b.c1
FROM
a LEFT JOIN b ON a.col1 = b.c1
WHERE
b.status = 'Y' ;
Run Code Online (Sandbox Code Playgroud)
等效于内连接,因为b.status在该WHERE部分中使用了列(从左外连接的右侧):
SELECT
a.col1, b.c1
FROM
a INNER JOIN b ON a.col1 = b.c1
WHERE
b.status = 'Y' ;
Run Code Online (Sandbox Code Playgroud)
第二个查询(可能)执行为:
SELECT
a.col1, b.c1
FROM
a LEFT JOIN b ON a.col1 = b.c1
AND b.status = 'Y' ;
Run Code Online (Sandbox Code Playgroud)
这可能会给出不同的结果,因为它是(逻辑上)不同的查询.
这是你永远不应该使用这种旧语法的原因之一.有时它是模糊的,例如,当存在多个条件或多个外连接时.
我知道Sybase和SQL Server密切相关.在*=已经从SQL Server中删除,但甚至早在SQL Server 2000中,它无法正常工作,有时解释为左连接,有时甚至交叉连接.由于Sybase和SQL Server来自相同的基础产品,我怀疑这也是您的问题以及结果不同的原因.不要对外连接使用隐式连接,因为它不能可靠地给出正确的答案.
以下是针对SQL Server 2000的联机丛书的直接引用,其中讨论了此问题:
在早期版本的Microsoft®SQLServer™2000中,
WHERE使用*=和=*运算符在子句中指定了左外连接条件和右外连接条件.在某些情况下,此语法会导致可能以多种方式解释的模糊查询.符合SQL-92的外部联接在FROM子句中指定,不会导致这种歧义.