使用IN语句SQLCODE 115时DB2子查询不起作用
我试图在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:
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
要完成的任务:
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”的行。你能推荐其他技术吗?或者可能是这个错误的原因?谢谢。谢谢你的发条。解决了我的问题。