sql >> データベース >  >> RDS >> Oracle

FROM キーワードが予期された場所に見つかりませんでした。テキスト選択 Oracle SQL

    すぐにエラーが発生するのは、連結の結果に 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 BYXMLAGG の句 、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
      


    1. 次のMySQLcsvインポートクエリ用語はどういう意味ですか?

    2. 2 jQueryまたはAjaxを使用したオートコンプリート/提案入力ボックスと、複数のアイテムを含む最初の選択に基づく2番目のボックス

    3. 6000万エントリ、特定の月からのエントリを選択します。データベースを最適化する方法は?

    4. org.postgresql.util.PSQLException:致命的:申し訳ありませんが、すでにクライアントが多すぎます