【问题标题】:Select multiple rows in table from another row that contains multiple values separated by commas从包含用逗号分隔的多个值的另一行中选择表中的多行
【发布时间】:2019-03-21 20:01:03
【问题描述】:

我有一张表,其中包含名为TaggedTitles 的标题和标签 ID。我有第二个表,其中包含标签和 TagID。 TaggedTitles 表有多个与每个标题相关联的标签。例如:

TaggedTitles 表:与标题“汽车”相关联的 TagID 列包含:1,5,7 表示标签表中的标签。在本例中,1,5,7 代表标签:车轮、油漆、地毯。我需要离开加入标签表以使用标题汽车作为参数返回车轮、油漆、地毯。

SELECT  
    Tags.TAGS
FROM 
    Tags
LEFT JOIN 
    TaggedTitles ON TaggedTitles.TAGID = Tags.TAGID
WHERE 
    TaggedTitles.TITLE = @Title

标题表

TAG_ID  TITLE       
-------------
  1     FRUIT       
  2     FRUIT       
  3     FRUIT       

标签表

TAG_ID  TAG     
----------------------
  1     ORANGES     
  2     APPLES      
  3     PEARS       

需要结果:来自参数“水果”的Oranges,Apples,Pears

【问题讨论】:

  • 呃……你有机会修复数据模型吗?存储分隔字符串违反了 1NF,并且使用起来很痛苦。每次查询它以查找行时,您都必须在分隔符上拆分整个表。此外,您上面的 where 子句已将您的左连接变成了内连接。
  • 我想我可以。最好将标题“汽车”存储在三个单独的行中,每个标签分别存储?我没有意识到在列中使用分隔字符串会这么复杂。
  • 如果您可以分享您当前的架构和几行示例数据,我可以展示如何规范您的结构。一旦这被规范化查询,这将是无痛的。
  • @SeanLange 我已更改数据模型,使其看起来像我在原始问题中粘贴的表格。
  • 那么您需要返回一个分隔列表吗?有数百个使用 STUFF 和 FOR XML 来实现此目的的示例。

标签: sql-server stored-procedures


【解决方案1】:

尝试将 XML PATH 与 STUFF 语句结合起来。

例如:

DECLARE @INFO TABLE (TAG_ID int, TITLE varchar(10)) 

INSERT @INFO VALUES (1,'ORANGES')
INSERT @INFO VALUES (2,'APPLES')
INSERT @INFO VALUES (3,'PEARS')

SELECT STUFF((
       SELECT ','+TITLE
       FROM @INFO
       FOR XML PATH('')
),1,1, '') AS FRUITS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多