右外连接到左外连接

时间:2014-01-31 16:47:37

标签: sql sql-server join sqlite

我在sqlserver中有一个需要翻译成sqlite3的查询,但是这个查询使用“右外连接”,问题是sqlite还不支持这个操作符。

如何将此查询翻译为仅使用“左外连接”而不是“右”外连接?

SELECT  *
FROM    P RIGHT OUTER JOIN
        CL RIGHT OUTER JOIN
        C LEFT OUTER JOIN
        CC ON C.IDC = CC.RIDC ON 
        C.IDC = C.RIDCL ON P.IDP = C.RIDP

感谢。

PS:我也遇到sqlite连接优先级和关联性问题,不知道如何通过重新排序表来改变最终结果。

2 个答案:

答案 0 :(得分:2)

在此查询中,表c位于中间。这就是推动查询。

您的on条件位于陌生的地方。我猜这就是你的意思:

SELECT  *
FROM    C LEFT OUTER JOIN
        CC
        ON C.IDC = CC.RIDC LEFT OUTER JOIN
        P
        ON P.IDP = C.RIDP LEFT OUTER JOIN
        CL
        ON CL.IDC = C.RIDCL

答案 1 :(得分:1)

关于连接语法的补充说明。

大多数人写

Tab1 JOIN Tab2 ON ... JOIN Tab3 ON ... JOIN Tab4 ON ...

可能是因为这是“自然”的方式,一个接一个的表。

但你的联接使用我通常试图避免的“其他”语法。

Tab1 JOIN Tab2 JOIN Tab3 JOIN Tab4 ON ... ON ... ON ... 

逻辑连接按ON的顺序处理,因此添加parens会导致:

( P
  RIGHT OUTER JOIN
   ( CL
     RIGHT OUTER JOIN
      ( C
        LEFT OUTER JOIN
        CC
        ON C.IDC = CC.RIDC
      ) p
     ON C.IDC = C.RIDCL
   ) 
  ON P.IDP = C.RIDP
)

重写它会产生连接顺序C-CC-CL-P。这不是戈登使用的C-CC-P-CL命令,但在你的情况下这没关系,因为C是主表: - )