Sql 联接三个表并将最后一个表行显示为列
我有以下表格: tblData:Sql 联接三个表并将最后一个表行显示为列,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有以下表格: tblData: ID Name Email -------------------------------------- 1 TestName1 test@email.com 2 TestName2 test2@email.com 3 TestName3 test3@email.com TBL邮件: ID Name Content ------
ID Name Email
--------------------------------------
1 TestName1 test@email.com
2 TestName2 test2@email.com
3 TestName3 test3@email.com
TBL邮件:
ID Name Content
------------------------------------------------
1 MailName1 Mail1 contents goes here
2 MailName2 Mail2 contents goes here
3 MailName3 Mail3 contents goes here
TBL合同:
ID DataId MailId
-------------------------------
1 1 1
2 1 2
3 3 1
4 3 3
现在,我想编写一个返回以下结果的查询:
ID Name Email MailName1 MailName2 MailName3
----------------------------------------------------------------------------------
1 TestName1 test@email.com True True False
2 TestName2 test2@email.com False False False
3 TestName3 test3@email.com True False True
此外,tblMail
是动态的。。它可以有更多行。因此,如果将来我添加新行,该列将显示在结果中
任何帮助都将不胜感激。谢谢您可以像这样动态构建sql:
declare @mailfields nvarchar(max) = N'',
@mailfieldselect nvarchar(max) = N'',
@sql nvarchar(max) = N'',
@dlm nchar(1)= ''
select @mailfields=@mailfields + @dlm + N'[' + Name + N']',
@mailfieldselect = @mailfieldselect + @dlm + N'case when [' + Name + N'] = 0 then ''False'' else ''True'' end as ' + Name,
@dlm=','
from tblMail
select @sql ='select ID, Name, ' + @mailfieldselect + '
from (
select d.ID, d.Name, m.Name as MailName
from tblData d
left join tblContacts c on d.Id=c.DataId
left join tblMail m on c.MailId=m.Id) f
pivot (count(MailName)
for MailName in (' + @mailfields + ')) p'
exec (@sql)
我甚至在这里添加了一个SQL Fiddle示例:您需要PIVOT函数来实现您的目标。但是,由于
tblMail
是动态的,并且需要不同数量的MailNameX
列,因此必须使用动态sql。不好玩,但可行。是的,我用pivot尝试了一些事情,但没有得到完全正确的结果。@DMasonAre你确定要这样显示结果吗?这意味着你会收到一百封邮件,一百栏,这不是很可读。事实上,你得到的是一个矩阵NxM,其中n是数据的数量,M是邮件的数量,我不会将你显示的结果限制在一系列数据或电子邮件中?我同意上述评论。我看不出这样扩展列有什么好处。在这种格式的UI中,数据也将不可用。如果您确实想在UI中进行操作,那么最好的办法是将数据带回来,然后进行显示。