5

ODBCおよびCrystal Reports 2008を介して、Oracle 11(正確なバージョンについてはわかりませんが、LISTAGGが機能しないため、リリース2ではないと思います)を使用しています。

これが私が抱えている問題です:

ここにテーブルがあります:

TABLE ODB.TASK_CARD_CONTROL  
------------------------------------------  
task_card     control_category     code  
------------------------------------------  
1                  zone             17  
1                  zone             33  
1                  zone             21  
2                  zone             18  
2                  zone             05  
3                  zone             55  
3                  zone             32  
3                  zone             72 

WM_CONCAT 関数を使用して、次のようなものを取得しています。

task_card      zones
1              17,33,21
2              18,05
3              55,32,72

そのための SQL は次のとおりです。

SELECT TASK_CARD, WM_CONCAT(code) as ZONES
FROM ODB.TASK_CARD_CONTROL
WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
GROUP BY TASK_CARD

しかし、ゾーンをソートしたいので、これを試しました:

SELECT TASK_CARD, WM_CONCAT(code) as ZONES
FROM (SELECT TASK_CARD, CODE, CONTROL_CATEGORY FROM ODB.TASK_CARD_CONTROL 
ORDER BY CODE)
WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
GROUP BY TASK_CARD

しかし、何らかの理由で、次のエラーが返されます。

Failed to retrieve data from the database.
Details: 42S22:[Oracle][ODBC][Ora]ORA-00904: 
"ODB"."TASK_CARD_CONTROL"."CONTROL_CATEGORY" : invalid identifier

ここで何が間違っているのか本当にわかりません...誰かヒントを教えてもらえますか?

4

6 に答える 6

6

まだ wm_CONCAT (旧バージョンの db) を使用している場合: 解決策は個別の条件を追加することです。その後、連結された値に昇順も適用されます。

文書化されていない理由を聞かないでください。ただし、動作します。

また、サブクエリで order by を使用すると、wm_concat の前で順序がランダム化されるだけなので、推奨されるべきではありませんでした。

要求された SQL の例:

SELECT TASK_CARD, WM_CONCAT(distinct code) as ZONES
FROM ODB.TASK_CARD_CONTROL
WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
GROUP BY TASK_CARD;

プロシージャー/パッケージで使用した場合、distinct オプションは機能しないことに注意してください。

于 2014-10-21T12:15:16.700 に答える
2

内部クエリの外部から ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY を参照することはできません。試す:

SELECT TASK_CARD, WM_CONCAT(code) as ZONES
FROM (SELECT TASK_CARD, CODE, CONTROL_CATEGORY FROM ODB.TASK_CARD_CONTROL 
      WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
      ORDER BY CODE)
GROUP BY TASK_CARD
于 2011-02-11T15:11:35.790 に答える
0
  1. 目的の列で並べ替えてから、
  2. 行番号による外部クエリの順序で並べ替えます。
  3. 機能を使用してください。

この関数には、最後の rownum オーダーのロジックがあります。

Select wmsys.wm_concat(t) CONCAT from 
(
    Select t from (
        Select t from (
            Select 'aa' t from dual
            union
            Select 'zz' t from dual
            union
            Select 'pp' t from dual
            union
            Select 'll' t from dual
            union
            Select 'mm' t from dual
            union
            Select 'xx' t from dual
            union
            Select 'cc' t from dual
        ) a 
        order by t
    ) order by rownum
) t
于 2015-08-26T18:52:18.187 に答える
0

LISTAGGは11g リリース 2で導入されました。

したがって、サポートされていない11g より前の Oracle バージョンでは、ROW_NUMBER ()およびSYS_CONNECT_BY_PATH関数LISTAGGを使用できます。

Oracle 文字列集計手法を参照してください。

SELECT task_card,
  LTRIM(MAX(SYS_CONNECT_BY_PATH(code,','))
  KEEP (DENSE_RANK LAST ORDER BY curr),',') AS zones
  FROM   (SELECT task_card,
                code,
                ROW_NUMBER() OVER (PARTITION BY fruit ORDER BY code) AS curr,
                ROW_NUMBER() OVER (PARTITION BY fruit ORDER BY code) -1 AS prev
         FROM   table_name)
  GROUP BY task_card
  CONNECT BY prev = PRIOR curr AND task_card= PRIOR task_card
 START WITH curr = 1;

ノート

WM_CONCATこれは文書化されていない機能であり、12c バージョンから削除されているため、使用しないでください。

機能に依存していたアプリケーションは、 にwm_concatアップグレードすると機能しなくなり12cます。それ以来、それは削除されました。Oracle で WM_CONCAT 関数を使用しない理由を参照してください。

SQL> select banner from v$version where rownum = 1;

BANNER
----------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production

SQL> SELECT object_name
  2  FROM dba_objects
  3  WHERE owner='WMSYS'
  4  AND object_name LIKE 'WM\_%' ESCAPE '\';

OBJECT_NAME
----------------------------------------------------------------------------
WM_REPLICATION_INFO
WM_RDIFF
WM_PERIOD
WM_PERIOD
WM_OVERLAPS
WM_MEETS
WM_LESSTHAN
WM_LDIFF
WM_INTERSECTION
WM_INSTALLATION
WM_GREATERTHAN
WM_EVENTS_INFO
WM_ERROR
WM_ERROR
WM_EQUALS
WM_DDL_UTIL
WM_DDL_UTIL
WM_CONTAINS
WM_COMPRESS_BATCH_SIZES
WM_COMPRESSIBLE_TABLES

20 rows selected.

SQL>

「<strong>無効な識別子」エラーが表示されます。

SQL> SELECT banner FROM v$version;

BANNER
----------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE    12.1.0.1.0      Production
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

SQL> SELECT deptno, wm_concat(ename) FROM emp;
SELECT deptno, wm_concat(ename) FROM emp
               *
ERROR at line 1:
ORA-00904: "WM_CONCAT": invalid identifier

したがって、最新バージョンでは利用できなくなった文書化されていない機能に依存しても意味がありません。

于 2015-09-11T16:27:43.187 に答える
0

from 句でサブクエリに名前を付けると、サブクエリ自体の列を参照できます

SELECT t1.TASK_CARD
, WM_CONCAT(t1.code) as ZONES
FROM 
(SELECT TASK_CARD, CODE, CONTROL_CATEGORY FROM ODB.TASK_CARD_CONTROL ORDER BY CODE) t1
WHERE t1.CONTROL_CATEGORY = 'ZONE'
GROUP BY t1.TASK_CARD
于 2012-05-28T13:46:48.980 に答える
-1

wm_concat の代わりに ListAgg を使用する

SELECT TASK_CARD, ListAgg(code) within (order by code asc) as ZONES

http://nimishgarg.blogspot.com/2010/07/oracle-differece-between-wmconcat-and.html

于 2012-03-16T08:41:05.533 に答える