SQLite使用多个表INNER JOIN时出现错误,使用USING(...)。

3

我正在尝试在SQLite数据库上运行一个查询,该查询使用INNER JOIN连接了另外两个表:

SELECT
    usages.date AS date,
    usages.data AS data,
    stores.number AS store,
    items.name AS item
FROM usages
INNER JOIN stores USING (store_id)
INNER JOIN items USING (item_id)

然而,我遇到了错误。
SQL error: cannot join using column item_id - column not present in both tables

我知道我可以使用明确的INNER JOIN stores ON usages.store_id = stores.store_id(它可以工作),但是:为什么USING查询在SQLite中会出错? 在MySQL上不会出现这种情况...
我应该注意:
这对我来说不是问题,因为我正在使用ON语法,但我想知道为什么会发生这种情况。

1
你说 INNER JOIN stores ON usages.store_id = stores.store_id 是可行的,但是错误信息并不是关于这个连接的。 - Martin Smith
@Martin:我知道,这就是我说的。 ON 语法可以工作,但 USING 语法不行。 - Austin Hyde
1个回答

4

那么你有:

INNER JOIN items USING (item_id)

当你得到一个错误提示时,它说:

SQL错误:无法使用列 item_id 进行连接 - 两个表格中都不存在该列。

这一定是我见过的最不难懂的错误信息之一了。但我不喜欢的是,我不清楚正在与 ITEMS.item_id 进行比较的表格是哪个 - 是 STORES 还是 USAGES?这就是为什么我不使用 USINGNATURAL 连接语法的原因...

是的,我考虑过那个问题,但是我尝试在它周围添加括号以澄清:FROM ((usages INNER JOIN stores USING (store_id)) INNER JOIN items USING (item_id)),但是那并没有起作用。 - Austin Hyde
1
@Austin Hyde:括号只在ON条件中起作用,它们不会给JOIN操作优先级。我想知道,在SQL中随意添加括号可以解决问题的观念来自哪里...Martin和我谨慎其事——现在是时候更加直接了:放弃USING语法,并修复你的查询。 - OMG Ponies
关于你的“思路”评论,我从未真正“学习”过SQL - 只是在需要做以前没有做过的事情时慢慢吸收其语法。在这种情况下,我阅读了关于ON语法及其最受支持的方式的文章,然后了解到了不太受支持但仍然标准的USING语法,并尝试使用它,因为它更简单。一旦它不起作用,我就毫不犹豫地切换到了ON语法,没有遇到任何问题。我只是想知道为什么使用USING无法连接多个表。 - Austin Hyde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接