【发布时间】: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