【问题标题】:Update a column based on results from junction table根据联结表的结果更新列
【发布时间】:2013-07-08 23:24:41
【问题描述】:

可能重复:Concatenate row values T-SQL

我有三张桌子。 Items、Organizations 和 Items_Organizations 联结表,提供两者之间的多对多关系。

Items 表包含“组织”列,我想在其中存储从联结表收到的每个项目的值;用逗号或类似符号将每个组织组合起来。

据我所知,在列中存储多个值并不是最佳做法,但是我需要通过一些处理程序在前端显示每个项目的组织,并且没有比存储多个值更好的主意一列中的值。

所以我在后端尝试做的是使用类似的东西更新“组织”列信息;

接收特定项目的组织:

SELECT OrganizationName FROM organizations
JOIN organizations ON organizations.organizationID =
Items_Organizations.organizationID 
WHERE Items_Organizations.item_ID = '1'

尝试使用 UPDATE 使用上述查询的结果表更新“组织”列

UPDATE items SET organizations = ?

这个问题很难说清楚。我希望我说得够清楚了。

【问题讨论】:

  • 所以你想获取OrganizationName的值并将它们用逗号分隔到organizations中存储?
  • 从这里开始:stackoverflow.com/questions/5031204/…。我想您需要先弄清楚如何在聚合函数中连接值。
  • 是的,所以我不需要在后端创建与其他表的连接,并且可以通过项目表管理所有内容。

标签: sql sql-server


【解决方案1】:

试试这个:

UPDATE i
SET i.organizations = 
  STUFF((
    SELECT ', ' + o.OrganizationName
    FROM Items_Organizations AS io
    INNER JOIN organizations AS o  ON o.organizationID = io.organizationID
    WHERE io.Item_Id = i.Item_Id AND io.Item_Id = 1
    FOR XML PATH(''))
  ,1,2,'')
FROM items AS i
WHERE i.Item_id = 1;

在这里查看它的实际效果:

【讨论】:

  • 谢谢!正是我想要达到的目标。
  • 如果我可能会问,是否可以以分层方式存储组织而不是在中间使用逗号,以便我可以将每个组织反映为 xml 中的子级项?
  • @Jorge.Methew 任何项目的所有组织都已存储为什么要将它们存储在额外的列中organizations?这是多余的数据,你可以做一个简单的SELECT语句来选择它们,不需要那个列organizations。这样你就打破了正常的形式。对于分层结构,您可以将额外的外键添加到 organizations 表作为自键,例如将 ParentOrganizationId 添加到同一个表中,这样每个组织都会有一个父组织。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多