【发布时间】:2011-03-23 11:18:51
【问题描述】:
我有一点 SQL 几乎可以做我想做的事。我正在使用三个表,即用户、UserPhoneNumbers 和 UserPhoneNumberTypes。我正在尝试获取用户列表及其电话号码以进行导出。
数据库本身很旧并且存在一些完整性问题。我的问题是数据库中每个电话号码应该只有一种类型,但事实并非如此。当我运行这个时,如果每个人包含例如两个“家庭”数字,我会得到多行结果。
如何修改 SQL 以获取列出的第一个电话号码并忽略其余号码?我在 SQL Server 中,我知道 TOP 语句。但是,如果我将“TOP 1”添加到 LEFT JOIN 选择语句中,它只会给我数据库中的第一个条目,而不是每个用户的第一个条目。
这适用于 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 查询。
-
解决方法是[这里][1],将join替换为left join即可。 [1]:stackoverflow.com/questions/2043259/…
标签: sql sql-server sql-server-2000 greatest-n-per-group