当前位置: 首页 > 面试题库 >

如何在SQL Server中将LEFT JOIN限制为第一结果?

袁秦迟
2023-03-14
问题内容

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

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

如何修改SQL以采用列出的第一个电话号码而忽略其余电话号码?我在SQL Server中,并且了解TOP语句。但是,如果我在LEFT JOIN
select语句中添加“ TOP 1”,它只是给我数据库中的第一个条目,而不是每个用户的第一个条目。

这是用于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 Server 2000,并且排名功能不存在,因此可以使子查询SELECT聚合:

SELECT UserID, MAX(PhoneNumber) AS HomePhone FROM [...] GROUP BY UserID

如果您不在乎返回用户的家庭住所号码…



 类似资料:
  • 我正在尝试从product表中获取所有记录,这些记录是唯一的,但我使用leftjoin添加第二个表,其中包含这些产品的图像,但当我这样做时,它会多次返回一些产品,因为一些产品有一个或多个图像。我如何在product_images表上使用限制来确保它只得到1个图像而不是全部。下面的例子不起作用,那么这可能吗?

  • 问题内容: 这是一个简化的表结构: 一个产品可以有多张照片,每个产品的第一张产品照片(基于photo_order)是默认照片。 现在,我只需要产品详细信息页面上的所有照片,但是在列出多个产品的页面(例如产品目录页面)上,我只想显示默认照片。 因此,我要尝试的是查询产品列表,包括每个产品的默认照片。 这显然行不通,它将返回所有照片,其中每张照片都重复了产品信息: 我需要弄清楚如何做这样的事情,但是我

  • 问题内容: 我想将用户限制在一个目录及其子目录中,但是“父目录”按钮允许他们浏览到任意目录。 我应该怎么做呢? 问题答案: 您可能可以通过设置自己的FileSystemView来实现。

  • 我有一个叫做com的方法。ACM软件。共享。AbstractDerrivedBean。getDerivedUniqueId()。当我JProfiler应用程序时,这个方法getDerivedUniqueId()实际上像预期的那样埋在了80个方法的深处。该方法代表应用程序中的每个bean调用。我试图记录CPU调用树,从这个方法开始,一直记录到叶节点(即,被排除的类之一)。 我尝试了以下方法,但没有达

  • 问题内容: 我有以下查询,该查询创建了一个视图表,该视图显示了商店中最高的销售员,其他信息很少: 上面的查询将仅显示单个商店的销售数据,其原因如上所述。我的桌子上有20家商店。如何更改上面的查询,以便为我提供20家商店的销售数据(即20行)。 问题答案: 根据上一个问题的答案,如果在同一家商店中以相同的总销售额捆绑多个员工,则将退回所有此类员工。

  • 问题内容: 问题:我有一个姓名和地址列表。一些名字(人)与其他名字(街道,邮政编码,城镇)具有相同的地址。我想选择所有出现的地址不超过三个的名称,并从其余三个名称中选择前三个名称,每个名称都指向同一地址。例子: 结果集应为 唐纳德(Donald)失踪是因为他是地址相同的小组的第四名。可以通过UNION和子查询实现此结果吗?就像是 我知道此查询是错误的,因为它限制了出现3次以上的地址的完整结果集。我