2

次のようなタグというテーブルがあります。

 --------------------
|TagId   |   TagName |
--------------------
| 1      |   Travel  |
 --------------------
| 2      |   Gadgets |
 --------------------
| 3      |   Hobbies |
 --------------------
| 4      |   Movies  |
 -------------------- 

また、Tags という XML データ型の列を含む別のテーブルがあります。

    -------------------------------------------------------------------------
   |PostId   |   Title          | Tags                                       |
    -------------------------------------------------------------------------
   | 1       |  Blog Post 1     | <xml><tags><tag>1</tag/><tag>2</tag></tags>|
   --------------------------------------------------------------------------
   | 2       |  Blog Post 2     | <xml><tags><tag>2</tag/><tag>3</tag></tags>|
   --------------------------------------------------------------------------
   | 3       |  Blog Post 3     | <xml><tags><tag>3</tag/><tag>4</tag></tags>|
   --------------------------------------------------------------------------

これら 2 つのテーブルのデータを結合して、次のような単一のビューを作成したいと考えています。ノード内の番号は、タグ テーブルへの外部キーとして機能する必要があります。

    ---------------------------------------------------------------------------
   | Title         | Tags                                                      |
    ---------------------------------------------------------------------------
   | Blog Post 1   | <xml><tags><tag>Travel</tag/><tag>Gadgets</tag><tags>     |
   ----------------------------------------------------------------------------
   | Blog Post 2   | <xml><tags><tag>Gadgets</tag/><tag>Hobbies</tag></tags>   |
   ----------------------------------------------------------------------------
   | Blog Post 3   | <xml><tags><tag>Hobbies</tag/><tag>Movies</tag></tags>    |
   ----------------------------------------------------------------------------

このようなビューを作成することは可能ですか? それ、どうやったら出来るの?

4

2 に答える 2

5

このような何かがうまくいくはずです:

/* SQL Follows */
select
postID, title,
tags,
(
    select 
        /* 4. Retrieve the tag name */
        y.tag.value('.', 'int') tagID,
        t.tagName
    from 
        /* 2. Shred the XML into nodes */
        p.tags.nodes('/xml/tags/tag') as y(tag)
        /* 3. Join the tag ID onto the tags table. */
        inner join #tags t on t.tagID = y.tag.value('.', 'int')
    for 
        /* 5. Convert it into XML */
        xml path('tag'), type
)tags2
/* 1. For each post */
from #posts p

この例では一時テーブル#tagsを使用しました。#posts正確な出力を取得するには、XML を少し調整する必要があります。

于 2012-04-26T10:02:01.080 に答える
0

あなたのデータがどうなっているのかわからないので、完全な解決策は提供しません。あなたが表示したほど単純ではないと確信していますが、正しい方向に向けることはできると思います.

ID を探して完全な文字列を置換し (たとえば 11 を指定すると失敗するため、1 だけを検索しないでください)、それを select where tagID=ID に置き換えます。

select replace('<xml><tags><tag>1</tag/><tag>2</tag></tags>','<tag>1</tag/>',(select name from tags where tagid=1))

結果:

<xml><tags>Travel<tag>2</tag></tags>

もちろん、これを行う方法はあなた次第ですが、各タグに対してこれを行う必要があります。タグ テーブルを参照するか、タグが数個しかない場合は、置換を数回実行します。

于 2012-04-26T09:47:10.733 に答える