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

構造化された XML データに加えて行データを選択する

    レベルごとに 3 つの CROSS APPLY を連続して行うと、少し短くなる場合があります

     SELECT HistoryId, 
            t.qID,
            t.questionText,
            t.result,
            a.aId,
            a.answerNbr,
            a.answerChosen,
            a.answerTxt
        FROM
            tbl_QuizHistory
        CROSS APPLY QuizData.nodes('quizresult') AS n(q)    
        CROSS APPLY (
            SELECT 
              ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS qID,
              t.q.value('(./questionText)[1]', 'nvarchar(max)') AS questionText,
              t.q.value('(./result)[1]', 'nvarchar(50)') AS result,
              t.q.query('.') queryXml
            FROM 
              n.q.nodes('./question') t(q)
        ) t
        CROSS APPLY (
            SELECT 
              ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS aID,
              q.a.value('(./@number)[1]', 'int') as answerNbr,
              q.a.value('(./@chosen)[1]', 'bit') as answerChosen,
              q.a.value('.','nvarchar(max)') as answerTxt
            FROM
              t.queryXml.nodes('question/answer') q(a)
       ) a;
    

    レベル固有の計算がない場合 (例:row_number() ) が必要です:

     SELECT HistoryId, 
            t.qID,
            t.questionText,
            t.result,
            q.a.value('(./@number)[1]', 'int') as answerNbr,
            q.a.value('(./@chosen)[1]', 'bit') as answerChosen,
            q.a.value('.','nvarchar(max)') as answerTxt
        FROM
            tbl_QuizHistory
        CROSS APPLY QuizData.nodes('quizresult') AS n(q)    
        CROSS APPLY (
            SELECT 
              ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS qID,
              t.q.value('(./questionText)[1]', 'nvarchar(max)') AS questionText,
              t.q.value('(./result)[1]', 'nvarchar(50)') AS result,
              t.q.query('.') queryXml
            FROM n.q.nodes('./question') t(q)
        ) t
        CROSS APPLY t.queryXml.nodes('question/answer') q(a)
    

    デモ



    1. VPS/専用サーバーでPostgreSQLを入手する方法

    2. ORA-29913:ODCIEXTTABLEOPENコールアウトの実行中にエラーが発生しました

    3. データベースを「online」に変更し、dbを「multi-user」に設定します

    4. Unityからデータベースに接続する方法