使用IN语句SQLCODE 115时DB2子查询不起作用

使用IN语句SQLCODE 115时DB2子查询不起作用,db2,subquery,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:

我试图在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表示比较无效。哪个不是

更新: 我想在这里完成的是。我有一个表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中检索所有值,其中第3行为KSASPREM
  • 如果从表1检索到的值中没有行1的值,则结果应包含一个额外的列“有效”值“是/否”,其中行3为“测试”
  • 希望我说清楚了,不要再让人困惑了

    有什么帮助吗? 谢谢
    Ps.更新了查询

    与许多事情一样,一个
    连接
    (这里,
    左连接
    )就是答案。具体来说,我们需要将(稍微修改的)子查询作为表引用:

    LEFT JOIN (SELECT DISTINCT row1, 'Valid' as valid
               FROM Table1
               WHERE row3 = 'TEST') AS Test
           ON Test.row1 = TB1.row1
    
    • LEFT JOIN
      告诉查询引擎“不需要此其他表中的行”
    • DISTINCT
      说,“对于这些列中的所有值组合,只给我一行”
    • 使用常量值-
      “有效”
      -返回该常量值
    。。。因此,我们得到一个(虚拟,临时)表,其中包含唯一的
    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'
    

    COALESCE(…)
    返回值列表中遇到的第一个非空值。因为,如果没有
    Test
    行,
    Test.valid
    将为空,这将为
    TB1
    行输出
    无效的
    ,而没有相应的
    Test
    行。(在内部,它调用了
    CASE
    ,我相信,这会让它更漂亮)

    请注意:

    • 我在
      OVER
      子句中加入了
      orderby
      ,以返回(大部分)一致的结果。如果您只计划运行一次,那没关系,但是如果您需要多次运行它并获得一致的
      ID
      s,那么您需要使用不会被洗牌的东西
    • DB2(显然还有PostgreSQL)支持将
      |
      作为concat操作符。它使阅读语句更容易理解
    • 切勿使用
      SELECT*
      ,因为以下几个原因,它不安全。始终指定所需的列

    据我所知,您需要将
    然后
    作为
    案例
    表达式的一部分。你想在那里完成什么?即使这是有效的语法,看起来也不会有任何效果。此外,
    Table1
    似乎有多个列(尽管名称非常奇怪,如
    row1
    ,等等),因此
    SELECT*
    会由于比较计数不匹配而导致语法错误。也许如果你展示你的桌子和想要的结果?请注意,
    ROW_NUMBER()
    的结果是连续的,但不确定的(每次运行都不同)。感谢您的回复。我已经更新了查询。我添加了THEN和ELSE caluse仍然是相同的错误。它抱怨+subquery
    中的
    作为
    CASE
    语句的一部分显然无效(除了
    END…
    之后缺少逗号的进一步语法错误)。无论如何,您可能不想在
    SELECT
    中作为子查询执行此操作-它可能会对每个结果行运行一次,这可能会很昂贵。您最好使用
    左连接
    +
    合并(…,'Invalid')
    -是否只有一行
    'TEST'
    ?您可能不需要调用
    TRIM(row1)
    ,除非有类似的行带有额外的空格(应该是固定的…)。我修复了逗号,但仍然存在相同的错误。还请注意,子查询只使用不同的WHERE查询同一个表。将有多个带有“TEST”的行。你能推荐其他技术吗?或者可能是这个错误的原因?谢谢。谢谢你的发条。解决了我的问题。