0

このエラーが発生します

DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=((select * from ( select rownumber() over(;BEGIN-OF-STATEMENT;<delete>, DRIVER=3.50.152

以下のクエリを実行すると:

((SELECT ORGANIZATION.ORGNAME AS ORGNAME
        ,SUBSCRIPTION.ID AS SUBSCRIPTIONID
        ,SUBSCRIPTION.NUMBEROFAVAILABLESEATS AS AVAILABLESEATS
    FROM SUBSCRIPTION SUBSCRIPTION
        ,ORGANIZATION ORGANIZATION
        ,CUSTOMER CUSTOMER
        ,CUSTOMERACCOUNT CUSTOMERACCOUNT
    WHERE ORGANIZATION.ISDELETED=0
      AND SUBSCRIPTION.DELETED=0
      AND CUSTOMERACCOUNT.ID=SUBSCRIPTION.CUSTOMERACCOUNTID
      AND CUSTOMER.ISDELETED=0
      AND CUSTOMERACCOUNT.CUSTOMERID=CUSTOMER.ID
      AND CUSTOMER.PARTYID=ORGANIZATION.ID
      AND ISLIMITEDSEAT=1 
UNION ALL 
  SELECT ORGANIZATION.ORGNAME
        ,SUBSCRIPTION.ID AS SUBSCRIPTIONID
        ,-1 AS AVAILABLESEATS
    FROM SUBSCRIPTION SUBSCRIPTION
        ,ORGANIZATION ORGANIZATION
        ,CUSTOMER CUSTOMER
        ,CUSTOMERACCOUNT CUSTOMERACCOUNT
    WHERE ORGANIZATION.ISDELETED=0
      AND SUBSCRIPTION.DELETED=0
      AND CUSTOMERACCOUNT.ID=SUBSCRIPTION.CUSTOMERACCOUNTID
      AND CUSTOMER.ISDELETED=0
      AND CUSTOMERACCOUNT.CUSTOMERID=CUSTOMER.ID
      AND CUSTOMER.PARTYID=ORGANIZATION.ID
      AND ISLIMITEDSEAT=0
 ) as results
  order by ORGNAME
) with ur

Hibrnate デコードされたクエリ:

"((select * from ( select rownumber() over(order by ORGNAME)with ur) as rownumber_, ORGANIZATION.ORGNAME AS ORGNAME,SUBSCRIPTION.ID AS SUBSCRIPTIONID,SUBSCRIPTION.NUMBEROFAVAILABLESEATS AS AVAILABLESEATS FROM SUBSCRIPTION SUBSCRIPTION,ORGANIZATION ORGANIZATION,CUSTOMER CUSTOMER,CUSTOMERACCOUNT CUSTOMERACCOUNT WHERE ORGANIZATION.ISDELETED=0 AND SUBSCRIPTION.DELETED=0 AND CUSTOMERACCOUNT.ID=SUBSCRIPTION.CUSTOMERACCOUNTID AND CUSTOMER.ISDELETED=0 AND CUSTOMERACCOUNT.CUSTOMERID=CUSTOMER.ID AND CUSTOMER.PARTYID=ORGANIZATION.ID AND ISLIMITEDSEAT=1 UNION ALL SELECT ORGANIZATION.ORGNAME,SUBSCRIPTION.ID AS SUBSCRIPTIONID,-1 AS AVAILABLESEATS FROM SUBSCRIPTION SUBSCRIPTION,ORGANIZATION ORGANIZATION,CUSTOMER CUSTOMER,CUSTOMERACCOUNT CUSTOMERACCOUNT WHERE ORGANIZATION.ISDELETED=0 AND SUBSCRIPTION.DELETED=0 AND CUSTOMERACCOUNT.ID=SUBSCRIPTION.CUSTOMERACCOUNTID AND  CUSTOMER.ISDELETED=0 AND CUSTOMERACCOUNT.CUSTOMERID=CUSTOMER.ID AND CUSTOMER.PARTYID= ORGANIZATION.ID AND ISLIMITEDSEAT=0) results order by ORGNAME)with ur ) as temp_ where rownumber_ <= ?"
4

3 に答える 3

0

クエリを少しフォーマットしました。ただし、構文が正しいかどうかはわかりません。はorder by少し寂しく見え (一致する選択項目がありません)、withが何をすべきかわかりません。

((SELECT ORGANIZATION.ORGNAME AS ORGNAME, 
    SUBSCRIPTION.ID AS SUBSCRIPTIONID,
    SUBSCRIPTION.NUMBEROFAVAILABLESEATS AS AVAILABLESEATS 
  FROM SUBSCRIPTION SUBSCRIPTION,
       ORGANIZATION ORGANIZATION,
       CUSTOMER CUSTOMER,
       CUSTOMERACCOUNT CUSTOMERACCOUNT 
  WHERE ORGANIZATION.ISDELETED=0 AND SUBSCRIPTION.DELETED=0 
    AND CUSTOMERACCOUNT.ID=SUBSCRIPTION.CUSTOMERACCOUNTID 
    AND CUSTOMER.ISDELETED=0 
    AND CUSTOMERACCOUNT.CUSTOMERID=CUSTOMER.ID
    AND CUSTOMER.PARTYID=ORGANIZATION.ID 
    AND ISLIMITEDSEAT=1 
UNION ALL 
  SELECT ORGANIZATION.ORGNAME,
         SUBSCRIPTION.ID AS SUBSCRIPTIONID,
         -1 AS AVAILABLESEATS 
  FROM SUBSCRIPTION SUBSCRIPTION,
       ORGANIZATION ORGANIZATION,
       CUSTOMER CUSTOMER,
       CUSTOMERACCOUNT CUSTOMERACCOUNT 
  WHERE ORGANIZATION.ISDELETED=0 
    AND SUBSCRIPTION.DELETED=0 
    AND CUSTOMERACCOUNT.ID=SUBSCRIPTION.CUSTOMERACCOUNTID 
    AND  CUSTOMER.ISDELETED=0 
    AND CUSTOMERACCOUNT.CUSTOMERID=CUSTOMER.ID 
    AND CUSTOMER.PARTYID=ORGANIZATION.ID 
    AND ISLIMITEDSEAT=0
 ) results order by ORGNAME
)with ur
于 2013-10-21T15:16:32.500 に答える
0

元の問題は括弧の配置が原因だった可能性がありますが、何が起こっているのかの長さと複雑さのために解明するのが難しくなりました.

いくつかの提案をまとめて、はるかに短いクエリを提供します。これにより、大幅に高速になり、次の人が理解しやすくなります。

何が起こっているのか見てみましょう。2 つのほぼ同一の SELECT が接着されています。それらをメッシュ化して単一の SELECT に戻すとします。

CASE 式の形のちょっとしたロジックは、2 つの SELECT をマージして並べ替えるよりも、全体的に作業が大幅に少なくなります。

省略形を作成しない限り、すべてのテーブル名を繰り返す意味はありません:

  FROM SUBSCRIPTION SUBSCRIPTION,

WHERE句よりもFROM句で結合条件を指定した方が、次の人にわかりやすいと思われることが多いです。

SELECT ORGANIZATION.ORGNAME,
       SUBSCRIPTION.ID         AS SUBSCRIPTIONID,
       CASE WHEN SUBSCRIPTION.ISLIMITEDSEAT = 1
            THEN SUBSCRIPTION.NUMBEROFAVAILABLESEATS
            ELSE -1 
        END                    AS AVAILABLESEATS
  FROM ORGANIZATION
  JOIN CUSTOMER
    ON  CUSTOMER.PARTYID = ORGANIZATION.ID
  JOIN CUSTOMERACCOUNT
    ON  CUSTOMERACCOUNT.CUSTOMERID = CUSTOMER.ID
  JOIN SUBSCRIPTION
    AND SUBSCRIPTION.CUSTOMERACCOUNTID = CUSTOMERACCOUNT.ID
  WHERE ORGANIZATION.ISDELETED=0
    AND SUBSCRIPTION.DELETED=0
    AND CUSTOMER.ISDELETED=0
    AND SUBSCRIPTION.ISLIMITEDSEAT IN (0,1) 

SUBSCRIPTION.ISLIMITEDSEAT が 0 または 1 のみのフラグである場合は、最後の行を削除します。

于 2013-10-23T00:02:24.500 に答える