Sybase ASE 15中左连接和*=之间的区别

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)

ype*_*eᵀᴹ 6

第一个查询:

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)

这可能会给出不同的结果,因为它是(逻辑上)不同的查询.

这是你永远不应该使用这种旧语法的原因之一.有时它是模糊的,例如,当存在多个条件或多个外连接时.


HLG*_*GEM 5

我知道Sybase和SQL Server密切相关.在*=已经从SQL Server中删除,但甚至早在SQL Server 2000中,它无法正常工作,有时解释为左连接,有时甚至交叉连接.由于Sybase和SQL Server来自相同的基础产品,我怀疑这也是您的问题以及结果不同的原因.不要对外连接使用隐式连接,因为它不能可靠地给出正确的答案.

以下是针对SQL Server 2000的联机丛书的直接引用,其中讨论了此问题:

在早期版本的Microsoft®SQLServer™2000中,WHERE使用*==*运算符在子句中指定了左外连接条件和右外连接条件.在某些情况下,此语法会导致可能以多种方式解释的模糊查询.符合SQL-92的外部联接在FROM子句中指定,不会导致这种歧义.