2

我有一个名为标签的表,如下所示:

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

我还有另一个表,其中有一个名为标签的 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>|
   --------------------------------------------------------------------------

我想组合这两个表中的数据,以创建一个视图,如下所示。节点内的数字应该作为标签表的外键。

    ---------------------------------------------------------------------------
   | 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(不要只查找 1,因为例如您可以有 11 并且会失败),然后将其替换为 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 回答