我在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连接优先级和关联性问题,不知道如何通过重新排序表来改变最终结果。
答案 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是主表: - )