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

问题描述 投票:0回答:1

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

以下为部分内容

**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. 如果 Row1 的值不在从 Table1 中检索到的值中,其中 Row3 为“TEST”,则结果应包含一个额外的列“有效”值是/否。
db2 subquery
1个回答
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 小提琴示例

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

注意:

  • 我在
    ORDER BY
    子句中放入了一个
    OVER
    ,以返回(大部分)一致的结果。如果你只打算运行一次没关系,但如果你需要多次运行它并获得一致的
    ID
    s,你需要使用不会被洗牌的东西。
  • DB2(显然还有 PostgreSQL)支持
    ||
    作为连接运算符。它使阅读语句更容易理解。
  • 永远不要使用
    SELECT *
    ,它不安全有几个原因。始终指定您想要的列。
© www.soinside.com 2019 - 2024. All rights reserved.