DB2 子查询无法使用 IN 语句 SQLCODE 115
DB2 subquery not working using IN statement SQLCODE 115
我正在尝试在 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
要完成的任务:
- 从 Table1 中检索所有值,其中 Row3 是 KSASPREM
- 如果 Row1 的值不在从 Table1 检索的值中,其中 Row3 是 'TEST'[=,则结果应包含一个额外的列 'Valid' 值 Yes/No 30=]
希望我说清楚了而不是更混乱了?
有什么帮助吗?
谢谢
Ps。更新了查询
与许多事情一样,JOIN
(此处为 LEFT JOIN
)就是答案。具体来说,我们需要将(稍作修改的)子查询作为 table 引用:
LEFT JOIN (SELECT DISTINCT row1, 'Valid' as valid
FROM Table1
WHERE row3 = 'TEST') AS Test
ON Test.row1 = TB1.row1
LEFT JOIN
告诉查询引擎 "rows in this other table aren't required".
DISTINCT
说,"for all value combinations in these columns, give me just one row"
- 使用常数值 -
'Valid'
- returns 那个常数值。
... 所以这为我们提供了一个(虚拟的,临时的)table,其中包含唯一的 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(...)
returns 在值列表中遇到的第一个非空值。因为,如果没有 Test
行,Test.valid
将为空,这会为 TB1
行输出 'Invalid'
而没有相应的 Test
行。 (内部它调用 CASE
,我相信,这只是让它更漂亮)
注意:
- 我在
OVER
子句中加入了 ORDER BY
,以获得 return(大部分)一致的结果。如果你只计划 运行 一次这没关系,但如果你需要多次 运行 并获得一致的 ID
s,你需要使用一些东西那不会被洗牌。
- DB2(显然还有 PostgreSQL)支持
||
作为连接运算符。它使阅读语句更容易理解。
- 永远不要使用
SELECT *
,它不安全有几个原因。始终指定您想要的列。
我正在尝试在 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
要完成的任务:
- 从 Table1 中检索所有值,其中 Row3 是 KSASPREM
- 如果 Row1 的值不在从 Table1 检索的值中,其中 Row3 是 'TEST'[=,则结果应包含一个额外的列 'Valid' 值 Yes/No 30=]
希望我说清楚了而不是更混乱了?
有什么帮助吗? 谢谢 Ps。更新了查询
与许多事情一样,JOIN
(此处为 LEFT JOIN
)就是答案。具体来说,我们需要将(稍作修改的)子查询作为 table 引用:
LEFT JOIN (SELECT DISTINCT row1, 'Valid' as valid
FROM Table1
WHERE row3 = 'TEST') AS Test
ON Test.row1 = TB1.row1
LEFT JOIN
告诉查询引擎 "rows in this other table aren't required".DISTINCT
说,"for all value combinations in these columns, give me just one row"- 使用常数值 -
'Valid'
- returns 那个常数值。
... 所以这为我们提供了一个(虚拟的,临时的)table,其中包含唯一的 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(...)
returns 在值列表中遇到的第一个非空值。因为,如果没有 Test
行,Test.valid
将为空,这会为 TB1
行输出 'Invalid'
而没有相应的 Test
行。 (内部它调用 CASE
,我相信,这只是让它更漂亮)
注意:
- 我在
OVER
子句中加入了ORDER BY
,以获得 return(大部分)一致的结果。如果你只计划 运行 一次这没关系,但如果你需要多次 运行 并获得一致的ID
s,你需要使用一些东西那不会被洗牌。 - DB2(显然还有 PostgreSQL)支持
||
作为连接运算符。它使阅读语句更容易理解。 - 永远不要使用
SELECT *
,它不安全有几个原因。始终指定您想要的列。