0

「エントリ」というテーブルに次のようなレコードがあります。

TABLE: Entry

ID      Tags
---     ------------------------------------------------------ 
1       Coffee, Tea, Cake, BBQ
2       Soda, Lemonade

...等。

表: タグ

ID      TagName
----    -----------
1       Coffee
2       Tea
3       Soda
...

TABLE: TagEntry

ID    TAGID    ENTRYID
---   -----    -------
1     1        1
2     2        1
3     3        2
....

Entry のテーブル全体の各レコードをループし、次に各行でカンマ区切りのタグをループする必要があります。これは、各タグを分割し、タグ名に基づいてタグ ルックアップを実行して TagID を取得し、最終的に TagID を挿入する必要があるためです。各コンマ区切りタグの TagEntry という名前のブリッジ テーブル内の EntryID

これについてどうすればよいかわかりません。

4

2 に答える 2

0

この SQL は、他のテーブルに結合するために、エントリ テーブルを分割します。

with raw as (
  select * from ( values 
    (1, 'Coffee, Tea, Cake, BBQ'),
    (2, 'Soda, Lemonade')
  ) Entry(ID,Tags)
)
, data as (
    select ID, Tag = convert(varchar(255),' '), Tags, [Length] = len(Tags) from raw
  union all
    select 
      ID   = ID,
      Tag  = case when charindex(',',Tags) = 0 then Tags else convert(varchar(255), substring(Tags, 1, charindex(',',Tags)-1) ) end,
      Tags = substring(Tags, charindex(',',Tags)+1, 255),
      [Length] = [Length] - case when charindex(',',Tags) = 0 then len(Tags) else charindex(',',Tags) end
    from data
    where [Length] > 0
) 
select ID, Tag = ltrim(Tag)
from data
where Tag <> ''

指定された入力に対してこれを返します。

ID          Tag
----------- ------------
2           Soda
2           Lemonade
1           Coffee
1           Tea
1           Cake
1           BBQ
于 2013-03-09T00:00:27.243 に答える
0

これを試して

;with entry as
(
    select 1 id, 'Coffee, Tea, Cake, BBQ' tags
    Union all
    select 2, 'Soda, Lemonade'
), tags as
(
    select 1 id,'Coffee' TagName union all
    select 2,'Tea' union all
    select 3,'Soda'
), entryxml as
(
    SELECT id, ltrim(rtrim(r.value('.','VARCHAR(MAX)'))) as Item from (
    select id, CONVERT(XML, N'<root><r>' + REPLACE(tags,',','</r><r>') + '</r></root>') as XmlString
    from entry ) x
    CROSS APPLY x.XmlString.nodes('//root/r') AS RECORDS(r)
)
select e.id EntryId, t.id TagId from entryxml e
inner join tags t on e.Item = t.TagName 
于 2013-03-08T23:17:11.773 に答える