【问题标题】:SQLite3 Simulate RIGHT OUTER JOIN with LEFT OUTER JOIN's without being able to change table orderSQLite3 使用 LEFT OUTER JOIN 模拟 RIGHT OUTER JOIN 而无法更改表顺序
【发布时间】:2020-01-10 11:16:47
【问题描述】:

我是 SQL 新手,最近开始在我的代码中实现连接,我希望检索的数据可以使用以下 SQL 语句完成。但是,如您所知,SQLite3 不支持 RIGHT OUTER 和 FULL OUTER JOIN。

因此,我想使用 LEFT OUTER JOIN 重写此语句,因为仅支持这些语句,我们将不胜感激。

在您继续将此问题标记为重复之前,我已经查看了其他类似问题的答案,但没有人解释重新排列查询以仅使用 LEFT JOIN 时的一般规则。

我还认为这个特定示例略有不同,因为如果不先加入 (class_placement) 表,就无法将表(句点)与任何一个表(teacher_subjects、classroom_subjects)连接起来。

FROM P
LEFT JOIN CP
 ON P.PID = CP.PID
RIGHT JOIN CS
 ON CP.CID = CS.CID
RIGHT JOIN TS
 ON CP.TID = TS.TID
WHERE (CP.CID IS NULL
      AND CP.TID IS NULL)
ORDER BY P.PID;

不出所料,运行此查询时我得到的错误是:

sqlite3.OperationalError: RIGHT and FULL OUTER JOINs are not currently supported

如果我真的很愚蠢,请提前抱歉,但如果您需要任何额外信息,请询问。非常感谢。

【问题讨论】:

  • 我想检索的数据可以用下面的SQL语句来完成你确定吗?它在 SQLite 中不起作用。您是否在任何其他数据库中尝试过?在对面有一个 LEFT 和 2 RIGHT 连接似乎很奇怪。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有所需和实际输出(包括逐字错误消息)的示例输入(作为表格初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。) PS 以最少的代码工作,您可以考虑对查询的下一个更改将是获得您想要的下一个部分结果。 (请参阅我的回答。)但是,如果您不编写和探索该代码,您怎么能摆脱困境?
  • @forpas 我知道这个语句不起作用是 SQLite,正如我所说,如果我完全诚实的话,我对 SQL 和 StackOverflow 完全陌生。我写了那个语句,知道它在 SQLite 中不起作用,但如果在支持 RIGHT JOIN 的 SQL 平台上运行,它会达到预期的结果,因此对于措辞不佳的问题造成的任何混淆,我深表歉意。未来参考 在来这里之前,我将自己进一步探索这个问题。给您带来的不便,我们深表歉意。
  • @Origami 我的问题是你怎么知道这段代码会返回你想要的预期结果 if 它在 SQLite 中工作?您是否在支持 RIGHT 连接的数据库中尝试过?我问这个是因为我不相信这样的带有 LEFT 和 RIGHT 连接的查询会起作用。
  • 嗨。我不知道你为什么删除你的表定义,但是根据我之前的评论,当你给出minimal reproducible example 时——并且应该在考虑发布问题之前完成一个——你应该为 SQL 提供 DDL,包括表声明& 初始化。 (如果你以极简的名义放弃它们——回想一下爱因斯坦,“尽可能简单,但并不简单”。)虽然解决方案和我选择解决它的方式碰巧并不特别需要。但是请注意,如果没有我可以剪切和粘贴的示例数据,我将不会测试运行(和消除错字)您的实际代码的重新排列。

标签: python-3.x sqlite left-join right-join


【解决方案1】:

忽略列顺序,x right join y on cy left join x on c。这通常是明确表示的。 (但您也可以只将连接的定义应用于原始表达式,以获得具有所需值的子表达式。)您可以阅读from 语法以了解如何使用括号或子查询优先级。应用我们得到的身份ts left join (cs left join (p left join cp on x) on y) on z

同样,忽略列顺序,x full join y on cy full join x on c。用left joinright join 来表达full join 是经常被问到的重复。

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2013-03-10
    • 1970-01-01
    • 2014-01-07
    • 2013-05-02
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多