如果标题不清楚,我会道歉 - 我只是不知道如何描述这个问题,而且我真的根本不了解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列不同。
所以任何人都可以提出任何建议,以及#34; flatten"联系成一排。我想到了将AddElTypeText和AddElementText连接到单个字符串字段中的事情,理想情况是在AddElTypeText和AddElementText之间有一个空格,然后是:或者,将AddElTypeText和AddElementText对分开。
但是,我很少知道如何实现这一目标,或者完全不同的方法是否会更好。非常感谢任何帮助!
加里
答案 0 :(得分:1)
正如@ twn08所说,此类问题以前一直被问到。在SQL Server中进行这种分组连接通常很麻烦,涉及使用FOR XML
。
话虽如此,here's a 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