DB2子查询无法使用IN语句SQLCODE 115

时间:2015-04-14 11:52:37

标签: db2 subquery

我正在尝试在DB2中执行查询。但它会引发以下错误:

Error: DB2 SQL Error: SQLCODE=-115, SQLSTATE=42601, SQLERRMC=IN, DRIVER=4.8.86
SQLState:  42601
ErrorCode: -115
Error: DB2 SQL Error: SQLCODE=-514, SQLSTATE=26501, SQLERRMC=SQL_CURSH200C1; STMT0001, DRIVER=4.8.86
SQLState:  26501
ErrorCode: -514

由于我的查询看起来正确,因此没有意义:

SELECT ROW_NUMBER() OVER() AS ID,
CONCAT(TRIM(TB1.ROW1),CONCAT('_',TRIM(TB1.ROW2))) AS CODE_DESCRIPTION,
CASE
    WHEN TRIM(TB1.ROW1) IN (SELECT T1.ROW1 FROM DB1.TABLE1 T1  WHERE T1.ROW3 = 'TEST')
    THEN 'Valid'
    ELSE 'Invalid'
END,
TB1.* FROM DB1.TABLE1 TB1
WHERE TB1.ROW3 = 'CLASS1';

SQLCode 115表示比较无效。哪个不是?

更新: 我想在这里完成的是。我有一个Table Table1(为简单起见,名称已更改)。以下是内容的一部分。

**Row3**    **Row1**                                **Row2**                                                                                                                                                                                                                                                                                                                
KSASPREM    SRQ                         0   0   Auto Carry                                                                                                                                                                                                                                                                                          SRQ                 
KSASPREM    SCG                         0   0   BRT Buses                                                                                                                                                                                                                                                                                           SCG                 
KSASPREM    SCE                         0   0   Buses                                                                                                                                                                                                                                                                                               SCE                 
KSASPREM    SRR                         0   0   Buses                                                                                                                                                                                                                                                                                               SRR                 
KSASPREM    SDC                         0   0   Domestic All Risks                                                                                                                                                                                                                                                                                  SDC                 
KSASPREM    SDA                         0   0   Domestic Buildings                                                                                                                                                                                                                                                                                  SDA    

完成任务:

  1. 从Table1中检索Row3为KSASPREM
  2. 的所有值
  3. 如果Row1的值不在从Table1检索到的值中,那么结果应该包含一个额外的列'有效'值是/否,其中Row3是'TEST'
  4. 希望我明确表达自己,而不是更加困惑?

    任何帮助? 谢谢 PS。更新了查询

1 个答案:

答案 0 :(得分:0)

与许多事情一样,JOIN(此处为LEFT JOIN)就是答案。具体来说,我们需要将(略微修改的)子查询作为表引用:

LEFT JOIN (SELECT DISTINCT row1, 'Valid' as valid
           FROM Table1
           WHERE row3 = 'TEST') AS Test
       ON Test.row1 = TB1.row1
  • LEFT JOIN告诉查询引擎其他表中的行不是必需的"。
  • DISTINCT说,"对于这些列中的所有值组合,只给我一行"
  • 使用常量值 - 'Valid' - 返回该常量值。

...所以这会让我们得到一个(虚拟,临时)表格,其中包含row1的唯一row3 = 'test'条目。

以下是完整查询:

SELECT ROW_NUMBER() OVER(ORDER BY TB1.row1) AS ID,
       TRIM(TB1.ROW1) || '_' || TRIM(TB1.ROW2) AS CODE_DESCRIPTION,
       COALESCE(Test.valid, 'Invalid') AS valid,
       TB1.row3, TB1.row1, TB1.row2
FROM Table1 TB1
LEFT JOIN (SELECT DISTINCT row1, 'Valid' as valid
           FROM Table1
           WHERE row3 = 'TEST') Test
       ON Test.row1 = TB1 .row1
WHERE TB1.ROW3 = 'KSASPREM'

SQL Fiddle Example

COALESCE(...)返回值列表中遇到的第一个非空值。因为,如果没有Test行,Test.valid将为空,则会为'Invalid'行输出TB1,而不会显示相应的Test行。 (在内部,它正在调用CASE,我相信,这只会让它变得更漂亮)

请注意:

  • 我已将ORDER BY放入OVER子句中,以返回(大部分)一致的结果。如果你曾经计划一次运行它并不重要,但是如果你需要多次运行它并获得一致ID s,那么你需要使用一些赢得胜利的东西。被洗牌。
  • DB2(显然是PostgreSQL)支持||作为concat运算符。它使阅读语句更容易理解。
  • 永远不要使用SELECT *,由于多种原因,它并不安全。始终指定所需的列。