【问题标题】:INNER JOIN clause returning no rows while NATURAL JOIN doesINNER JOIN 子句在 NATURAL JOIN 执行时不返回任何行
【发布时间】:2016-06-19 03:50:14
【问题描述】:

我坚持在 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

有什么想法吗?

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

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

【问题讨论】:

  • "REL_References_Pages.ReferenceID" 应该是"REL_References_Pages"."ReferenceID"

标签: sql sqlite inner-join quotation-marks


【解决方案1】:

我相信你得到空输出(没有行)的原因是因为在你的 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

【讨论】:

  • 非常感谢。我认为 TableName.Column 构造是整体的。将 qotes 放在“References”中。ReferenceID 全部修复。感谢其他两个cmets。我之前确实尝试过,但由于选择无法正常工作,我很困惑是什么问题。
  • 我已经添加了对您运行查询时实际发生的情况的说明。
  • 非常感谢。我花了几个小时试图弄清楚。
猜你喜欢
  • 2013-05-14
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多