1

抱歉,如果标题不清楚 - 我只是不知道如何描述这个问题,而且我真的不太了解 SQL/根本不了解 SQL。

我正在使用我们的案例管理系统使用的数据库。在某些地方,开发商显然已经延长了时间。我正在使用联系方式(姓名、地址等),他们添加了额外的字段来处理电子邮件地址并允许家庭/工作/手机号码等...

问题是他们没有为每个单独的新字段添加一个新字段。相反,他们在 2 个不同的表中添加了几个字段 - 第一个字段包含字段名称,第二个字段包含实际数据。

第一个在名为 AdditionalAddElTypes 的表中称为 AddElTypeText - AddElTypeText 字段包括“工作电话 1”、“传真”、“家庭电子邮件”等值......(总共有 10 个不同的值,我看不到开发人员很快就会扩大这个数字)

第二个字段在名为 AdditionalAddressElements 的表中称为 AddElementText - AddElementText 然后包含实际数据,例如电话号码、电子邮件地址。

对于那些(与我不同)发现查看 SQL 代码更容易的人,它是:

SELECT
  Address.AddressLine1
  ,AdditionalAddElTypes.AddElTypeText
  ,AdditionalAddressElements.AddElementText
FROM
  Address
  INNER JOIN AdditionalAddressElements
    ON Address.AddressID = AdditionalAddressElements.AddressID
  INNER JOIN AdditionalAddElTypes
    ON AdditionalAddressElements.AddElTypeID = AdditionalAddElTypes.AddElTypeID

我可以使用它,但如果任何联系人有 2 个或更多“附加”元素,我会得到多行,其中大部分数据相同,但只有 AddElTypeText 和 AddElementText 的 2 列不同。

因此,任何人都可以提出任何建议将联系人“压平”成一行。我想到了类似将 AddElTypeText 和 AddElementText 连接成一个字符串字段,理想情况下在 AddElTypeText 和 AddElementText 之间有一个空格,然后是 : 或 ,分隔 AddElTypeText 和 AddElementText 对。

但是,我几乎不知道如何实现这一目标,或者完全不同的方法是否会更好。非常感谢您的任何帮助!

加里

4

1 回答 1

1

正如@twn08 所说,这种类型的问题以前一般都被问过。在 SQL Server 中进行这种分组连接通常很痛苦,涉及使用FOR XML.

话虽这么说,这是一个 SQLFiddle,(我相信)它做了你想要的事情。这是实际的查询:

WITH Results AS
(
  SELECT a.*,
    t.AddElTypeText,
    aa.AddElementText
  FROM
    Address a
  INNER JOIN
    AdditionalAddressElements aa
    ON a.AddressID = aa.AddressID
  INNER JOIN
    AdditionalAddElTypes t
    ON aa.AddElTypeID = t.AddElTypeID
)
SELECT
  res.AddressID,
  STUFF((
    SELECT ', ' + AddElTypeText + ': ' + AddElementText 
    FROM Results
    WHERE (AddressID = res.AddressID) 
    FOR XML PATH (''))
  ,1,2,'') AS AdditionalElements
FROM Results res
GROUP BY res.AddressID
于 2013-06-19T18:05:04.653 回答