我需要帮助来理解这件事,下面两个查询之间有什么区别,我只知道它们不会返回相同的结果。

查询 1:

SELECT a.col1, b.c1
  FROM A a
  LEFT JOIN B b
    ON a.col1 = b.c1
 WHERE b.status = 'Y'

查询 2:
SELECT a.col1, b.c1
  FROM A a, B b
 WHERE a.col1 *= b.c1
   AND b.status = 'Y'

最佳答案

第一个查询:

SELECT
       a.col1, b.c1
FROM
       a LEFT JOIN b ON a.col1 = b.c1
WHERE
       b.status = 'Y' ;

等效于内连接,因为 b.status 列(来自左外连接的右侧)用于 WHERE 部分:
SELECT
       a.col1, b.c1
FROM
       a INNER JOIN b ON a.col1 = b.c1
WHERE
       b.status = 'Y' ;

第二个查询(可能)执行为:
SELECT
       a.col1, b.c1
FROM
       a LEFT JOIN b ON a.col1 = b.c1
                    AND b.status = 'Y' ;

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

这就是您永远不应该使用这种旧语法的原因之一。有时它是模棱两可的,例如当存在多个条件或多个外部联接时。

关于sql - Sybase ASE 15 中左连接和 *= 之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13765173/

10-15 19:45