Проблема с запросом в DB2 - Не удалось найти причину - PullRequest
0 голосов
/ 07 января 2020

Я пытался выполнить приведенный ниже запрос в Db2, и он выдал мне ошибку, которую я не могу определить root. Может кто-нибудь помочь, пожалуйста.

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)

1 Ответ

1 голос
/ 07 января 2020

Вы можете использовать data-change-table-reference подвыбора, если вы хотите использовать CTE для оператора изменения данных.

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
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...