1

タグまたはキーワードを格納する1つの列を持つtable記事がありますkeywords

サンプルデータ

Table Article
------------------------------------------
ID    keywords
------------------------------------------
1     one, two, three
2     four, five, six
3     seven, eight, three
4     one, two, three
5     twenty, hundred, one hundred one, one hundred two, seventy
6     seventy, three, two hundred 

以下のようにCTEクエリを使用すると、すべてのキーワード列が1つの行に連結されますが、反対側にも重複する行が表示されます。これは、数百の類似したキーワードを含む1000の記事があるため問題です。

SELECT TOP 1 
    stuff(
    (
    select cast(',' as varchar(max)) + lower(Keywords)
    from art_Article a
    for xml path('')
    ), 1, 1, '') AS All_Keywords
FROM
    art_Articles G
ORDER BY
    G.ArticleKeywords ASC;

上記のクエリは、単一行として次の結果を生成します

---------------------------------------------------
All_Keywords
----------------------------------------------------
one, two, three,four, five, six,seven, eight, three,one, two, three,twenty, hundred, one hundred one, one hundred two, seventy,seventy, three, two hundred 

結果から、重複するキーワードnoも表示されていることがわかります。行に格納されている時間の。重複するキーワードを1回だけ取得する方法はありますか?

DISTINCTキーワードのみを含む単一の列として結果を取得するためにこれを並べ替えるのに役立つ人がいれば幸いです。

4

3 に答える 3

4

データを連結する前に、まずデータを行に分割する必要があると思います。FOR XML PATHこれにより、を使用して最終リストを取得するときに、個別の値を取得できます。

このプロセスのCTEバージョンは次のとおりです。

;with cte (id, word, words) as
(
  select id,
    cast(left(keywords, charindex(',',keywords+',')-1) as varchar(50)) word,
         stuff(keywords, 1, charindex(',',keywords+','), '') words
  from article
  union all
  select id,
    cast(left(words, charindex(',',words+',')-1) as varchar(50)) word,
    stuff(words, 1, charindex(',',words+','), '') words
  from cte
  where words > ''
) 
select top 1 
    stuff((select distinct ', '+ rtrim(ltrim(word))
           from cte
           for xml path('')), 1, 1, '') AS All_Keywords
from cte

SQL FiddlewithDemoを参照してください。結果は次のようになります。

|                                                                                                             ALL_KEYWORDS |
----------------------------------------------------------------------------------------------------------------------------
|  eight, five, four, hundred, one, one hundred one, one hundred two, seven, seventy, six, three, twenty, two, two hundred |
于 2013-01-29T10:51:58.590 に答える
2

相関サブクエリはそれを行う必要があります:

SELECT G.ID,
    stuff(
    (
    select cast(',' as varchar(max)) + lower(Keywords)
    from art_Article a
    where a.id = g.id
    for xml path('')
    ), 1, 1, '') AS All_Keywords
FROM
    art_Articles G
ORDER BY
    G.ArticleKeywords ASC;
于 2013-01-29T13:04:08.050 に答える
0

解決策の1つは、結果をSplit関数と組み合わせ、DISTINCTを使用してSQLステートメントを実行することです。必要に応じてこれをさらに変更できます。私はテストをしていて、それは私のために働いています。それが他の人々に役立つことを願っています。

DECLARE @Keywords nvarchar(MAX)
SELECT TOP 1 @Keywords =
    stuff(
    (
    select cast(',' as varchar(max)) + lower(Keywords)
    from Article U
    for xml path('')
    ), 1, 1, '') 
FROM
    Articles G
ORDER BY
    G.ArticleKeywords ASC;

SELECT DISTINCT(VALUE) AS VALUE FROM [uf_SplitKeywords] (',', @Keywords)

以下の分割機能コード

ALTER FUNCTION [dbo].[uf_SplitKeywords] 
   (  @DELIMITER VARCHAR(5), 
      @LIST      VARCHAR(MAX) 
   ) 
   RETURNS @TABLEOFVALUES TABLE 
      (  ROWID   int IDENTITY(1,1), 
         [VALUE] VARCHAR(MAX) 
      ) 
AS 
   BEGIN
   Declare @Pos int
   While LEN(@List) > 0
      begin
        Select @Pos=CHARINDEX(@Delimiter,@List,1)      
        if @Pos>0
           begin
             Insert into @TABLEOFVALUES ([Value]) Values (SubString(@List,1,@Pos -1))
             Select @LIST = STUFF(@List,1,@Pos ,'')
           end
        else  
            begin
            Insert into @TABLEOFVALUES ([Value]) Values (@List)
            Select @LIST =''
            end  
      end
   Return 
   End
于 2013-01-29T11:00:22.423 に答える