我有一点SQL几乎正在做我想做的事情。我正在使用三个表,用户,UserPhoneNumbers和UserPhoneNumberTypes。我正在尝试通过电话号码获取用户列表以进行导出。如何将LEFT JOIN限制为SQL Server中的第一个结果?
数据库本身是旧的并且有一些完整性问题。我的问题是,数据库中每个电话号码应该只有一种类型,但情况并非如此。当我运行这个时,如果他们包含两个“家庭”号码,我会得到每个人的多行结果。
如何修改SQL以取出列出的第一个电话号码并忽略剩余的数字?我在SQL Server中,并且我知道TOP语句。但是,如果我将'TOP 1'添加到LEFT JOIN select语句中,它只是给我数据库中的第一个条目,而不是每个用户的第一个条目。
这是SQL Server 2000
感谢,
SELECT Users.UserID,
Users.FirstName, Users.LastName,
HomePhone, WorkPhone, FaxNumber
FROM Users
LEFT JOIN
(SELECT UserID, PhoneNumber AS HomePhone
FROM UserPhoneNumbers LEFT JOIN UserPhoneNumberTypes ON UserPhoneNumbers.UserPhoneNumberTypeID=UserPhoneNumberTypes.UserPhoneNumberTypeID
WHERE UserPhoneNumberTypes.PhoneNumberType='Home') AS tmpHomePhone
ON tmpHomePhone.UserID = Users.UserID
LEFT JOIN
(SELECT UserID, PhoneNumber AS WorkPhone
FROM UserPhoneNumbers LEFT JOIN UserPhoneNumberTypes ON UserPhoneNumbers.UserPhoneNumberTypeID=UserPhoneNumberTypes.UserPhoneNumberTypeID
WHERE UserPhoneNumberTypes.PhoneNumberType='Work') AS tmpWorkPhone
ON tmpWorkPhone.UserID = Users.UserID
LEFT JOIN
(SELECT UserID, PhoneNumber AS FaxNumber
FROM UserPhoneNumbers LEFT JOIN UserPhoneNumberTypes ON UserPhoneNumbers.UserPhoneNumberTypeID=UserPhoneNumberTypes.UserPhoneNumberTypeID
WHERE UserPhoneNumberTypes.PhoneNumberType='Fax') AS tmpFaxNumber
ON tmpFaxNumber.UserID = Users.UserID
取决于您所谈论的SQL版本。如果它是SQL Server 2005+,则有许多选项,包括RANK查询。 – 2010-07-30 21:23:30
SQL Server是版本2000. – Justin808 2010-07-30 21:27:34
解决方案是[这里] [1],只需用左连接代替连接。 [1]:http://stackoverflow.com/questions/2043259/sql-server-how-to-join-to-first-row – qub1n 2014-05-13 19:48:19