存储过程离开加入最高记录

时间:2014-02-25 03:34:25

标签: sql-server sql-server-2008 sql-server-2005 stored-procedures

我的公司表包含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)

目前它提取两个记录,我如何修改所以如果找到多个记录,它只会拉出最高记录?

谢谢

1 个答案:

答案 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

SQL Fiddle demo