3

我在 Cloudant 中有一个文档 ID 为的数据库_id

将此数据从 Cloudant 复制到 dashDB 后,我有 2 个要使用此_id列加入的单独表。在运行 SQL 我尝试了以下,但这不会运行。我在这里想念什么?我是否需要将列名替换为_id不带下划线的名称?

select m.title, m.year, g.value 
from MOVIES m
inner join MOVIES_GENRE g on m._ID = g._ID;
4

1 回答 1

4

TL;DR:正如@gmiley 指出的那样,问题是由_ID列名引起的,它不是普通的标识符(参见下面的定义),因此需要在 SQL 语句中用双引号"_ID"或单引号括起来。'_ID'

select m.title, m.year, g.value 
from MOVIES m
inner join MOVIES_GENRE g on m."_ID" = g."_ID";

与普通标识符不同,带引号的标识符区分大小写"_id"不等同于"_ID"title等同于TITLE)。如果您要"_id"在语句中指定,则会引发错误,指示未找到该列。

由于您已经提到您已经使用Cloudant 仓储流程来填充您的 DashDB 表,因此可能值得一提的是,在模式发现期间生成 DDL 时,属性名称是大写的。

示例:具有此结构的 JSON 文档的内容

 {
  "_id": "000018723bdb4f2b06f830f676cfafd6",
  "_rev": "1-91f98642f125315b929be5b5436530e7",
  "date_received": "2016-12-04T17:46:47.090Z",
  ...
 } 

将映射到三列:

  • _ID类型 VARCHAR(...)
  • _REV类型VARCHAR(...)
  • DATE_RECEIVED类型...
  • ...

希望这可以帮助!


来自DB2 SQL 参考

普通标识符是一个大写字母后跟零个或多个字符,每个字符是一个大写字母、一个数字或下划线字符。请注意,在指定普通标识符时可以使用小写字母,但在处理时会转换为大写字母。普通标识符不应是保留字。

例子:WKLYSAL WKLY_SAL

定界标识符是由双引号括起来的一个或多个字符的序列。序列中的前导空白很重要。序列中的尾随空格并不重要,尽管它们与标识符一起存储。两个连续的引号用于表示分隔标识符内的一个引号。这样,标识符可以包含小写字母。

例子: "WKLY_SAL" "WKLY SAL" "UNION" "wkly_sal"

于 2017-03-23T07:39:30.153 回答