INNER JOIN子句返回没有行,而NATURAL JOIN执行

时间:2016-03-05 09:40:25

标签: sql sqlite inner-join quotation-marks

我很难在SQLite中进行简单的连接。

我有两个表 - 一个有数据,另一个有指针:

  • References包含ReferenceIDReference
  • REL_References_Pages包含ReferenceIDPageID

正常连接查询工作正常并返回好结果:

SELECT Reference
FROM "References" 
NATURAL JOIN REL_References_Pages
WHERE PageID = 6

但是如果我尝试做一个显式的JOIN,结果没有错误,但是没有返回结果。它被卡住的地方是ON条款:

SELECT Reference
FROM "References" 
JOIN REL_References_Pages ON "REL_References_Pages.ReferenceID" = "References.ReferenceID"
WHERE PageID = 6

有什么想法吗?

我可以使用NATURAL JOIN,但我想知道为什么普通连接不起作用。

此外,表References有一个愚蠢的名字,但它就是这样。

1 个答案:

答案 0 :(得分:2)

我相信你得到空输出(没有行)的原因是因为在你的on子句中你试图比较两个不相等的字符串,从而返回false

简单地说,在命令下面会产生一个false布尔输出:

SELECT "REL_References_Pages.ReferenceID" = "References.ReferenceID"

在整个table.column构造周围尝试不带引号,不需要它。在您的情况下,最初只在数据模型中封装References表。至少我认为。

SELECT Reference
FROM "References" 
JOIN REL_References_Pages
  ON REL_References_Pages.ReferenceID = "References".ReferenceID
WHERE PageID = 6

使用别名甚至更好:

SELECT Reference
FROM "References" AS r 
JOIN REL_References_Pages AS rp
  ON r.ReferenceID = rp.ReferenceID
WHERE PageID = 6

您也可以通过应用USING表达式来缩短代码,因为两个表中的列名完全相同,并且您不需要以这种方式为查询中的表分配别名:

SELECT Reference
FROM "References"
JOIN REL_References_Pages USING ( ReferenceID )
WHERE PageID = 6