首页 > 解决方案 > SQL Server:自联接查询;仅选择与名字匹配的记录,而没有 where 语句

问题描述

我对 SQL Server 完全陌生。我被困在一个实验室问题上。我不能使用 WHERE 语句来限制结果。我附上了下面给我的指示。预期结果应返回 6 行。我目前返回 122 行。我们正在使用 Microsoft SQL Server Management Studio。我们正在从一个包含数千条记录的大型预配置数据库中提取数据。

这是实验室引用的文字。

编写返回三列的 SELECT 语句:

  • VendorID 来自 Vendors 表
  • VendorName 来自 Vendors 表
  • VendorContactFName 和 VendorContactLName 的联系人姓名别名,中间有一个空格。

编写一个 SELECT 语句,比较其 VendorContactFName 与另一个 VendorContactFName 具有相同名字的每个供应商。换句话说,找到 VendorContactFName 具有相同名字的所有不同供应商。复合 JOIN 条件。

没有 WHERE 条件。按联系人姓名对最终结果集进行排序(返回 6 行)

提示:使用自连接和相关名称;例如:供应商表是 V1 和 V2。查询中的 QUALIFY ALL COLUMN NAMES,包括 SELECT 语句中的列名

到目前为止,这是我想出的,但无法弄清楚如何在没有 WHERE 语句的情况下限制记录。我可能有多余的代码,我在这里不需要,或者缺少我需要的代码。

这是我想出的开始的代码。

SELECT  
    V1.VendorID AS VendorID, V1.VendorName AS VendorName,
    V1.VendorContactFName  + ' ' +  V1.VendorContactLName AS [Contact Name] 
FROM 
    Vendors AS V1 
JOIN 
    Vendors AS V2 ON (V1.VendorContactFName = V2.VendorContactFName) 
                  AND (V1.VendorID = V2.VendorID)
ORDER BY 
    [Contact Name];

查询结果

数据库图

标签: sql-serverselectself-join

解决方案


您只需要更新 JOIN 条件,FirstName 应该在 V1 和 V2 之间匹配,但 vendorId 应该不同。也使用CONCAT联系人姓名的功能

SELECT DISTINCT V1.VendorID AS VendorID, 
       V1.VendorName AS VendorName,
       CONCAT(V1.VendorContactFName, ' ', V1.VendorContactLName)
        AS [Contact Name] 
FROM Vendors AS V1 JOIN Vendors AS V2 
    ON  (V1.VendorContactFName = V2.VendorContactFName) AND
        (V1.VendorID <> V2.VendorID)
ORDER BY [Contact Name]

推荐阅读