【问题标题】:Sqlite Join to a JoinSqlite 连接到连接
【发布时间】:2015-07-30 18:47:07
【问题描述】:

我习惯在 Oracle 中执行此操作(我认为甚至是 SqlServer 一段时间),但我还没有弄清楚如何在 sqlite 中执行此操作。

sqlite 中的标准“简单”连接可以这样完成:

select *
from kennel k
    join kennelbreeder kb
    on kb.kennelid = k.rowid;

但如果我还想从饲养员那里获得一些信息,根据我在其他地方的经验,我希望以下方法可行,但它没有:

select *
from kennel k
    join kennelbreeder kb
        join breeder b
        on kb.breederid = b.rowid
    on kb.kennelid = k.rowid;

我得到的错误是'Error: near "on": syntax error'。这样做的正确方法是什么?

【问题讨论】:

  • 为什么投反对票?这似乎是一个明确的、可以回答的问题,不是吗?

标签: sql oracle join sqlite


【解决方案1】:

在 Sqlite 中,连接不能嵌套:

select *
from kennel k
    join kennelbreeder kb ON kb.kennelid = k.rowid;
    join breeder b on kb.breederid = b.rowid 

【讨论】:

  • “在包括 Oracle 在内的每个 DBMS 中都无效...”完全不正确。关于 sqlite,将连接彼此相邻而不是放在内部似乎确实具有预期的效果。想法是:我不想将饲养员表加入到犬舍表中,我想将饲养员加入到 kennelbreeder(加入到犬舍)。在 Oracle 中,我总是将这些嵌套编写。
  • @LimitedAtonement:你是对的。我误读了你的语法。但实际上嵌套连接和“串行”编写它们之间没有区别(至少对于内部连接来说不是)
  • 它们在语义上是相同的,这是有道理的,但我认为嵌套语法更容易阅读。在没有视觉和位置背景的情况下连续列出它们时,最终会问:“现在我要加入什么?”特别是当您多次加入同一张桌子时。例如,“person”、“class”和“studentclass”表:一个班级有一个老师(来自 person),一个班级有多个学生(同样来自 person)。要创建“完整”查询,需要将该人加入查询两次。
【解决方案2】:

on 必须跟在join 后面。这只是一个关于正确顺序的问题。

select *
from kennel k
    join kennelbreeder kb
        on kb.kennelid = k.rowid
    join breeder b
        on kb.breederid = b.rowid;

您的第二个示例似乎基于嵌套连接的语法,我只在 MS Access 中看到过这种语法,但它始终带有括号,而您的示例中没有这些语法。这个查询似乎适用于 MS SQL 和 SQLite3,也可能适用于其他数据库:

SELECT * 
FROM kennel k
    JOIN ( kennelbreeder kb 
        JOIN breeder b
        ON kb.breederid = b.rowid )
    ON kb.kennelid = k.rowid;

我不建议使用后一种语法,因为它不清楚并且不是编写连接的标准方式。

【讨论】:

  • 看来你是个编辑!我编辑了您的第二个 SQL,使其看起来与我的第二个 SQL 相似。看起来我在第一个JOIN 之后缺少(,在最后一个ON 之前缺少)。我从来没有这样写过,所以我猜它的总和是 oracle 想出了如何推断这些括号,并且我在学习多个连接时依赖于该功能。
  • @LimitedAtonement 看起来是这样;虽然我强烈推荐编写连接的标准方法,而不是嵌套。自 90 年代初以来,我一直在做数据库方面的工作,我唯一一次看到嵌套语法是在 Access 生成的代码中——我从未见过它是由人编写的 :)
猜你喜欢
  • 2023-04-08
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多