すぐにエラーが発生するのは、連結の結果に 2 つのエイリアスが与えられているためです:You have AS LIST as ids
。計算結果に 2 つの別名を付けることはできません。新しく作成したテーブルに列 LIST
を持たせたい場合 次に as ids
を削除します 、およびその逆。
その後、別のエラーが発生します:ORDER BY t1.a
を試みています 集計で。それはうまくいきません。 XML 集計では CLOB で並べ替えることはできません。集計が行われる順序を本当に気にしますか?そうでない場合は、ORDER BY NULL
に変更します 。 Oracle では order_by_clause
が CLOB 式で順序付けすることはできません。他の方法を使用して、注文用に別の列を作成する必要があります。
ソリューション全体では、WITH 句は必要ありません。クエリで "input_strings" を参照する場合 (WITH 句を除く) は、単に "table_expressions" と記述してください。
編集
これを機能させる方法を次に示します。まず、CREATE TABLE ステートメントを示します。 table_expressions
と仮定します 検索文字列の CLOB 列があり、この列に重複がないこと。それでも、テーブルには、LOB やその他の長い非標準型ではないデータ型の別の主キーも必要です。これには NUMBER を使用します。
次に、この主キー列で集計します。残念ながら、検索文字列を同時に選択することはできません。 SELECT MAX(t2.a)
できました しかし、それは CLOB 値でも機能しません!代わりに、主キーを検索文字列に一致させるために、さらに結合が必要です。 (申し訳ありませんが、これにより、クエリにさらに時間がかかります...)
集計では、列 a
の文字列値の最初の 4000 文字で並べ替えます 。これは、入力文字列全体による並べ替えほどではありませんが、NULL による並べ替えよりは優れています。
create table a_x ( a, b ) as select to_clob('atveroeosipsumloremipsumdolor'), 1 from dual union all select to_clob('stetclitakasdtest') , 2 from dual union all select to_clob('noseatakimataatveroeosipsum') , 3 from dual union all select to_clob('loremipsumdolor') , 4 from dual union all select to_clob('consetetursadipscingelitr') , 5 from dual ; create table table_expressions ( a, pk ) as select to_clob('atveroeosipsum') , 10 from dual union all select to_clob('test') , 11 from dual union all select to_clob('stetclitakasd') , 12 from dual union all select to_clob('noseatakimata') , 13 from dual union all select to_clob('loremipsumdolor') , 14 from dual union all select to_clob('consetetursadipscingelitr'), 15 from dual ; create table a_y as select te.a, s.ids from table_expressions te join (select t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()') ORDER BY cast(t1.a as varchar2(4000))).GetClobVal(),',') as ids from a_x t1 join table_expressions t2 on t1.a like '%' || t2.a || '%' group by t2.pk ) s on te.pk = s.pk ;
プレ>取得したものを確認してみましょう:
select * from a_y; A IDS ------------------------- --------------------------------------------------------- atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum test stetclitakasdtest stetclitakasd stetclitakasdtest noseatakimata noseatakimataatveroeosipsum loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor consetetursadipscingelitr consetetursadipscingelitr
プレ>編集 #2
テーブル
a_x
の ID を連結する必要がある場合 (列b
)、CLOB 自体ではなく、t1.a
を置き換えます。t1.b
を使用 (そして、ORDER BY
でXMLAGG
の句 、cast
は必要ありません 、単にorder by t1.b
).drop table a_y purge; create table a_y as select te.a, s.ids from table_expressions te join (select t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.b,',').EXTRACT('//text()') ORDER BY t1.b).GetClobVal(),',') as ids from a_x t1 join table_expressions t2 on t1.a like '%' || t2.a || '%' group by t2.pk ) s on te.pk = s.pk ; select * from a_y; A IDS ------------------------- --- atveroeosipsum 1,3 test 2 stetclitakasd 2 noseatakimata 3 loremipsumdolor 1,4 consetetursadipscingelitr 5
プレ>