Sqlite连接到一个连接

Sqlite连接到一个连接,sql,oracle,join,sqlite,Sql,Oracle,Join,Sqlite,我习惯于在Oracle中这样做(我想不久前甚至是SqlServer),但我还没有弄清楚如何在sqlite中这样做 sqlite中的标准“简单”连接可以这样做: select * from kennel k join kennelbreeder kb on kb.kennelid = k.rowid; 但是,根据我在其他地方的经验,如果我也想从饲养员那里获得一些信息,我希望下面的方法能够奏效,但事实并非如此: select * from kennel k join ken

我习惯于在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'
。正确的方法是什么?

上的
必须跟随
加入
。这只是一个关于正确顺序的问题

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;

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

在Sqlite中,联接可能不是嵌套的:

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

“在包括Oracle在内的所有DBMS中都无效…”完全不正确。关于sqlite,将连接放在彼此相邻的位置而不是放在内部似乎确实达到了预期的效果。其思想是:我不想将繁殖者表加入犬舍表,我想将繁殖者加入犬舍繁殖者(即加入犬舍)。在Oracle中,我总是写这些嵌套的命令。@limitedAtoniment:你是对的。我误读了你的语法。但实际上嵌套连接和“串行”写入连接之间没有区别(至少对于内部连接来说不是),这说明它们在语义上是相同的,但我认为嵌套语法更容易阅读。当在没有视觉和位置上下文的情况下连续列出它们时,人们最终会问:“现在我要加入什么?”尤其是当您多次加入同一个表时。例如,“person”、“class”和“studentclass”表:一个类有一个教师(来自person),一个类有多个学生(同样来自person)。要创建“完整”查询,需要将此人加入查询两次。为什么会有否决票?这似乎是一个明确的、可以回答的问题,不是吗?看来你是一个相当出色的编辑!我编辑了您的第二个SQL,使其看起来与我的第二个SQL相似。看起来我在第一次加入
之后和
)上最后一次加入
之前缺少
)。我从来没有这样写过它,所以我想它的总和是oracle想出了如何推断这些括号,而我在学习多重连接时就依赖了这个功能。@limitedatoniment,看起来是这样的;尽管我强烈推荐编写联接的标准方法,但不使用嵌套。从90年代初开始,我就一直在做数据库方面的工作,唯一一次看到嵌套语法是在Access生成的代码中——我从来没有见过由人编写的:)