gpt4 book ai didi

sql - 如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?

转载 作者:行者123 更新时间:2023-12-02 01:26:59 24 4
gpt4 key购买 nike

我有一些 SQL 几乎可以做我想要它做的事情。我正在使用三个表:Users、UserPhoneNumbers 和 UserPhoneNumberTypes。我正在尝试获取用户列表及其电话号码以供导出。

数据库本身很旧并且存在一些完整性问题。我的问题是,数据库中的每个电话号码应该只有一种类型,但事实并非如此。当我运行此命令时,如果每个人包含两个“家庭”号码,我会得到多行结果。

如何修改 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

最佳答案

每当您想为右表中的每一行仅选择左表中的顶行时,您应该考虑使用 APPLY 运算符而不是联接,并将联接条件移至内部 左连接:

SELECT  u.UserID, 
u.FirstName, u.LastName,
hn.PhoneNumber AS HomePhone
FROM Users u
OUTER APPLY (
SELECT TOP(1) PhoneNumber
FROM UserPhoneNumbers upn
LEFT JOIN UserPhoneNumberTypes upt
ON upn.UserPhoneNumberTypeID=upt.UserPhoneNumberTypeID
WHERE upt.PhoneNumberType='Home'
AND upn.UserID = u.UserID
ORDER BY ...) as hn
...

关于sql - 如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com