2016-09-04 4 views
-1

SQLで類似の行を連結するのに1日以上を費やしました。SQL(I)の行を連結する方法

私はSquirrel SQLクライアント3.6を使用してクエリを実行しています。以下は、私が複数のテーブルから行を取得するために使用したクエリです。

select 
    A.NACCES as NACCES, 
    (CASE WHEN A.CLNKTYP = 1 THEN 'must' WHEN A..CLNKTYP = 2 THEN 'not' ELSE 'NONEED' END) as Link, 
    B.NPART as part 
from 
    HPL.KACCST B, HPL.KAMCLT A, HPL.KCACMT C 
where 
    A.NMOD = '1212' 
    and C.NMOD = A.NMOD 
    and C.NSALGNP = '223' 
    and C.NCUST = '' 
    and C.NACCES = A.NACCES 
    and B.NACCES = A.NACCES_LINK 

結果が

NACCES  Link part 

    1  must a 
    1  not  b 
    1  not  c 
    2  must d 
    2  must e so on... 

今、私はNACCESとリンク列に基づいて一部の列を連結する必要があります。..

である私は、スタックオーバーフローで、この上のいくつかの記事を見ていると私はFORみましたXML PATHクエリですが、運はありません。

SELECT 
    P.accessory, 
    P.Link, 
    STUFF((SELECT DISTINCT ',' + S.part 
      FROM (SELECT A.NACCES as NACCES, 
         (CASE 
          WHEN A.CLNKTYP = 1 THEN 'must' WHEN A..CLNKTYP = 2 THEN 'not' ELSE 'NONEED' 
          END) as Link, 
         B.NPART as part 
       FROM HPL.KACCST B, HPL.KAMCLT A, HPL.KCACMT C 
       WHERE A.NMOD = '1212' AND C.NMOD = A.NMOD AND C.NSALGNP = '223' 
        AND C.NCUST = '' AND C.NACCES = A.NACCES AND B.NACCES = A.NACCES_LINK) AS S 
      WHERE S.NACCES = P.NACCES 
      AND S.Link = P.Link 
      FOR XML PATH('')), 1, 1, '') AS PART 
FROM 
    (SELECT 
     A.NACCES as NACCES, 
     (CASE WHEN A.CLNKTYP = 1 THEN 'must' WHEN A..CLNKTYP = 2 THEN 'not' ELSE 'NONEED' END) as Link, 
     B.NPART as part 
    FROM 
     HPL.KACCST B, HPL.KAMCLT A, HPL.KCACMT C 
    WHERE 
     A.NMOD = '1212' 
     AND C.NMOD = A.NMOD 
     AND C.NSALGNP = '223' 
     AND C.NCUST = '' 
     AND C.NACCES = A.NACCES 
     AND B.NACCES = A.NACCES_LINK) AS P 
GROUP BY 
    P.NACCES, P.Link 

ERROR:

DB2 SQL Error: SQLCODE=-199, SQLSTATE=42601, SQLERRMC=FOR;;(. AT

MICROSECONDS MICROSECOND SECONDS SECOND MINUTES MINUTE, DRIVER=3.53.95
SQLState: 42601

ErrorCode: -199
Error: DB2 SQL Error: SQLCODE=-514, SQLSTATE=26501, SQLERRMC=SQL_CURLH200C1, DRIVER=3.53.95
SQLState: 26501
ErrorCode: -514

私はリスのツールでも、GROUP_CONCATてみました、私はGROUP_CONCATが利用可能エラーではありません取得しています。

私はクエリを実行するためにリスを使用していますメモしておきますと、私はこれを実行しないXML構文の原因を期待してください。

私はCOALESCEと試みたが、これもうまくいきませんでした。私を助けてください。

+2

[悪い習慣をキックする:使用して古いスタイルなJOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- ANSI - ** 92 ** SQL標準(** 20年以上**)の*正しい* ANSI 'JOIN'構文で置き換えられた古いスタイルの*カンマ区切りのテーブル*前に)、その使用はお勧めしません。 –

+0

確かに私はそれらの古いスタイルの結合を避けるでしょう。しかし今、それは私の心配ではありません。 @marc_s – pravallika

+0

DB2に 'listagg()'があります。https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc /doc/r0058709.html –

答えて

0

は、検索の多くの後、私は、DB2の列を連結するためのクエリを見つけました。

varchar(1024)と同じように、NACCES、LINK、replace(replace(置き換えられます(キャスト(XMLSERIALIZE)コンテンツXMLAGG(XMLELEMENT(名前 "x"、S.PART)注文はS.PART) AS CLOB )、) ')')、 ''、 '')を から ( )と指定すると、アクセサリm1_.NACCESをNACCESとして選択します(accessorym1_.CLNKTYP = 1の場合は、 WHEN accessorym1_.CLNKTYP = 2 THEN 'notcompatible' ELSE 'NONEED' END)LINK、accessory0_.NPART一部として からHPL.KACCST accessory0_、HPL.KAMCLT accessorym1_、HPL.KCACMT customerac2_ accessorym1_.NMOD = '1212として'およびcustomerac2_.NMOD = accessorym1_.NMODおよびcustomerac2_.NSALGNP =' 223 'および customerac2_.NCUST = '' とcustomerac2_.NACCES = accessorym1_.NACCESとaccessory0_.NACCES = accessorym1_.NACCES_LINK )P

は、あなたのコメントのためのみんなに感謝します。