我的公司表包含id, name
,我的联系表包含company id, firstname, contacttype
(类型= 40(管理员),类型= 41(用户))
我有一个查询,创建一个临时表,其中包含一行公司名称,名字(管理员),名字(用户),某些记录可能有名字(管理员),有些可能有名字(用户),有些可能有两个
DECLARE @tempreport TABLE
(
cName varchar(50),
cFirstAdmin varchar(50),
cFirstUser varchar(50)
)
insert into @tempreport (cName, cFirstAdmin, cFirstUser)
SELECT
company.name
,[admin].firstname AS FirstAdmin
,[user].firstname AS FirstUser
FROM company
LEFT JOIN contact [admin] ON [admin].companyid = company.id AND [admin].type = 40
LEFT JOIN contact [user] ON [user].companyid = company.id AND [user].type = 41
这很有效。
问题:在contact
表中,它可能有多个联系人,例如,公司ID(1),名字(bob),类型(40),公司ID(1),名字(迈克) ),键入(40)
目前它提取两个记录,我如何修改所以如果找到多个记录,它只会拉出最高记录?
谢谢
答案 0 :(得分:1)
是的,您可以使用子查询:
select company.name,
(select top 1 firstname from contact
where contact.companyid = company.companyid
and contact.type = 40) as FirstAdmin,
(select top 1 firstname from contact
where contact.companyid = company.companyid
and contact.type = 41) as FirstUser
from company
您可以添加更多条件或订购子查询以选择所需的用户。
更新:
根据要求,这是一个更复杂的版本,可以为每种用户类型获取更多列。它使用左连接和ROW_NUMBER()
只获得一行。我使用NEWID()
命令使其随机排列,但您可以按自己喜欢的任何顺序排序。
select company.name,
contactadmin.firstname AdminFirstName, contactadmin.lastname AdminLastName,
contactuser.firstname UserFirstName, contactuser.lastname UserLastName
from company
left join (select row_number() over (order by newid()) as rownumber, companyid, firstname, lastname from contact
where type = 40) contactadmin
on contactadmin.companyid = company.companyid
and contactadmin.rownumber = 1
left join (select row_number() over (order by newid()) as rownumber, companyid, firstname, lastname from contact
where type = 41) contactuser
on contactuser.companyid = company.companyid
and contactuser.rownumber = 1