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

时间:2012-12-07 14:35:16

标签: 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'

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

5 个答案:

答案 0 :(得分:6)

第一个查询:

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' ;

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

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

答案 1 :(得分:5)

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

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

  

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

答案 2 :(得分:3)

很抱歉有点迟了,但我找到了解决方案:在旧语法*=中,条件b.Status = 'Y'将位于左连接on子句中,因此必须具有相同的结果第一个查询我刚刚将b.Status = 'Y'移到了“on”子句。

答案 3 :(得分:0)

这些查询看起来一样。你说他们没有返回相同的结果。你有一个例子吗?

旧的和新的联接符号确实不同的地方在于您将联接的位置移动到了

Select
  a.col1, 
  b.c1
From
  A
    Left Join
  B 
    On a.col1 = b.c1 And b.Status = 'Y';

这是不同的,并且不能在旧的表示法中如此容易地表示(至少在Oracle中没有,没有Sybase的直接经验)

Example(虽然Oracle使用(+)代替*=

答案 4 :(得分:0)

当涉及到多个涉及多个where子句的2个以上的表时,我试图找到将旧查询转换为新查询的方法,但是在网上找不到它,因此在此处发布了我的解决方案。如果遵循以下技巧,结果将完全匹配:

在进行以下查询时:

    select a.*
    from A a, B b, C c
    where a.server_id=0
    and a.name = 'John'
    and a.country_id*=b.value_cd
    and b.table_nm = 'Employee'
    and b.Attribute_nm ='A_nm'
    and a.state_id*= c.value_cd
    and c.table_nm = 'Company'

除第一个表(即表A)外的所有where条件都可以进入连接的on子句中,但是具有第一个表的where条件应保留在Where子句中,如以下查询所示:

    select a.*
    from A a
    left join B b on a.country_id = b.value_cd 
       and b.table_nm = 'Employee' 
       and b.Attribute_nm ='A_nm'
    left join C c on a.state_id = c.value_cd 
       and c.table_nm = 'Company' 
    where a.server_id=0
       and a.name = 'John'