如何从dashDB表中使用名为_id的列?

时间:2017-03-22 18:17:09

标签: sql cloudant dashdb warehouse

我在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;

1 个答案:

答案 0 :(得分: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"不同,而titleTITLE相同。如果您在语句中指定"_id",则会引发错误,表明找不到该列。

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

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

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

将映射到三列:

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

希望这有帮助!

来自DB2 SQL reference

  

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

     

示例:WKLYSAL WKLY_SAL

     

分隔标识符是由一个或多个字符包围的序列   双引号。序列中的前导空白非常重要。   尽管存储了序列中的尾随空白但并不重要   带有标识符。两个连续的引号用于表示   分隔标识符中的一个引号。用这种方式标识符   可以包含小写字母。

     

实施例:   "WKLY_SAL" "WKLY SAL" "UNION" "wkly_sal"