sql - DB2 中的查询问题——无法找到原因
问题描述
我试图在 Db2 中执行以下查询,它给了我一些错误,我无法确定根本原因。有人可以在这里帮忙。
with
test as(
select * from (
select
ID,SOURCE,NUMBERD
from TABLE where RND='4')t (ID,SOURCE,NUMBERD)
),
t as (
select
ID,
count(*) qnt,
count(distinct SOURCE) distinct_qnt,
count(distinct NUMBERD) NUMBERD_CNT,
sum(case when SOURCE = 'EXTERNAL' then 1 else 0 END) external_qnt,
sum(case when SOURCE <> 'EXTERNAL' then 1 else 0 END) internal_qnt
from test
group by ID
)
delete from TABLE where RND='4' and ID in(
select ID from(
select
ID,
case when (external_qnt = 0 or external_qnt = qnt or NUMBERD_CNT >1) then 3
when (external_qnt = 1 and distinct_qnt = qnt and internal_qnt=0) then 2 else 1 END scenario_id
from t where case when (external_qnt = 0 or external_qnt = qnt or NUMBERD_CNT >1) then 3
when (external_qnt = 1 and distinct_qnt = qnt and internal_qnt=0) then 2 else 1 END in(2,3))asd)
执行上述查询时出现的错误是
DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=delete from;by qsMatchSetID ) ;<from>, DRIVER=3.58.81
但是,如果我单独评论删除部分并执行查询,它工作正常,如下所示。
with
test as(
...............
...........
from test
group by ID
)
--delete from TABLE where RND='4' and ID in(
select ID from(
select
ID,
case when (external_qnt = 0 or external_qnt = qnt or NUMBERD_CNT >1) then 3
when (external_qnt = 1 and distinct_qnt = qnt and internal_qnt=0) then 2 else 1 END scenario_id
from t where case when (external_qnt = 0 or external_qnt = qnt or NUMBERD_CNT >1) then 3
when (external_qnt = 1 and distinct_qnt = qnt and internal_qnt=0) then 2 else 1 END in(2,3))
---asd)
解决方案
如果您想将 CTE 用于数据更改语句,您可以使用subselect的 data-change-table-reference 。
declare global temporary table session.table (rnd varchar(10), id int, SOURCE varchar(10), NUMBERD int)
with replace on commit preserve rows not logged;
with
test as
(
select *
from
(
select ID, SOURCE, NUMBERD
from SESSION.TABLE
where RND='4'
) t (ID,SOURCE,NUMBERD)
)
, t as
(
select
ID,
count(*) qnt,
count(distinct SOURCE) distinct_qnt,
count(distinct NUMBERD) NUMBERD_CNT,
sum(case when SOURCE = 'EXTERNAL' then 1 else 0 END) external_qnt,
sum(case when SOURCE <> 'EXTERNAL' then 1 else 0 END) internal_qnt
from test
group by ID
)
SELECT COUNT(1)
FROM OLD TABLE
(
delete from SESSION.TABLE
where RND='4' and ID in
(
select ID
from
(
select
ID
, case
when (external_qnt = 0 or external_qnt = qnt or NUMBERD_CNT >1) then 3
when (external_qnt = 1 and distinct_qnt = qnt and internal_qnt=0) then 2 else 1
END scenario_id
from t
where
case
when (external_qnt = 0 or external_qnt = qnt or NUMBERD_CNT >1) then 3
when (external_qnt = 1 and distinct_qnt = qnt and internal_qnt=0) then 2
else 1
END in (2,3)
) asd
)
);
推荐阅读
- django - Django Form:在模板中调用外键字段属性
- powershell - 没有这样的主机是已知的(Powershell/OCI)
- python - Azure 函数中的 POST 端点
- python-3.x - 从父类函数调用内部函数
- python - 外部程序关闭时如何停止计时器[Python]
- html - 如何使用 svg mat-icon 调整 mat-button 的大小
- elasticsearch - Elasticsearch 日期直方图
- laravel - 只返回查询的值,而不是函数内的“column”:“value”键对
- google-cloud-platform - Google API Gateway 抛出 400,带有下划线的标头的错误请求错误
- python - 将 json 文件嵌套到 Python 中的不同 DF