【问题标题】:Right Outer Join to Left Outer join右外连接到左外连接
【发布时间】:2014-02-24 11:12:21
【问题描述】:

我在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 连接优先级和关联性方面也遇到了问题,不知道它如何通过重新排序表格来改变最终结果。

【问题讨论】:

标签: sql sql-server join sqlite


【解决方案1】:

在此查询中,表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

【讨论】:

  • 居中“推动查询”是什么意思?
  • 如果你画了一张查询图表。从表中绘制箭头以显示连接的“外部性”。 “C”表将在中间,所有箭头都指向它。
【解决方案2】:

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

大多数人都会写作

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

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

但是您的联接使用了我通常尽量避免的“其他”语法。

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

逻辑上的连接是按 ON 的顺序处理的,所以添加括号会导致:

( 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。这不是 Gordon 使用的 C-CC-P-CL 顺序,但在您的情况下这并不重要,因为 C 是主表:-)

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2010-09-16
    • 2011-10-01
    相关资源
    最近更新 更多