Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sqlserver:自连接查询;仅选择名匹配且没有where语句的记录_Sql Server_Select_Self Join - Fatal编程技术网

Sql server sqlserver:自连接查询;仅选择名匹配且没有where语句的记录

Sql server sqlserver:自连接查询;仅选择名匹配且没有where语句的记录,sql-server,select,self-join,Sql Server,Select,Self Join,我对SQL Server完全陌生。我被困在实验室的问题上了。我不能使用WHERE语句来限制结果。我附上了下面给我的说明。预期结果应返回6行。我当前返回122行。我们正在使用Microsoft SQL Server Management Studio。我们正在从一个包含数千条记录的大型预配置数据库中提取数据 这是引自实验室的文本 编写返回三列的SELECT语句: 供应商表中的VendorID 供应商表中的VendorName VendorContactFName和VendorContactLNa

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

这是引自实验室的文本

编写返回三列的SELECT语句:

  • 供应商表中的VendorID
  • 供应商表中的VendorName
  • VendorContactFName和VendorContactLName的联系人姓名别名,中间有空格
编写一条SELECT语句,比较其VendorContactFName与另一VendorContactFName同名的每个供应商。换句话说,查找其VendorContactFName具有相同名字的所有不同供应商。 复合连接条件

无何处条件。按联系人名称对最终结果集进行排序(返回6行)

提示:使用自连接&关联名称;例如:供应商表是V1和V2。限定查询中的所有列名,包括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];


您只需要更新连接条件,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]
选择DISTINCT V1.VendorID作为VendorID,
V1.VendorName作为VendorName,
CONCAT(V1.VendorContactFName',V1.VendorContactLName)
AS[联系人姓名]
从供应商作为V1加入供应商作为V2
打开(V1.VendorContactFName=V2.VendorContactFName)和
(V1.VendorID V2.VendorID)
订购人[联系人姓名]

欢迎来到堆栈溢出,克里斯。你的问题没有包含足够的细节,我们无法帮助你。查看并了解一个项目的重要性。然后,根据需要编辑您的问题。特别是一些样本数据和预期结果会很有帮助。逻辑还不清楚。“我必须只返回联系人姓名字段中具有匹配名字的记录。”因此
ID1 | Bob | Smith
“匹配”
ID2 | Bob | Somebodyelseski
?这似乎不是一个有用的数据集。我同意生成的数据集毫无意义,但这正是教授想要的……请阅读并付诸行动。同时点击谷歌的“stackexchange家庭作业”——解释你是如何得到你的查询的。PS分配结果描述不好。“比较”是模糊的,不适合描述结果而不是过程。“不同”是没有帮助的。(它可能是想说一些关于不同行的内容。)PS作业中说要返回哪些列?在你引用的块中没有任何地方说你的教授需要6条记录?您的教授要求所有与另一个供应商同名的供应商-为什么您也将姓氏作为联接条件?在您知道自己在做什么以及为什么之前,不要使用DISTINCT—它从来都不是复制由联接笛卡尔函数创建的记录的解决方案。始终使用显式内部、左外部、右外部和完全外部联接限定符。通常,表名不使用AS别名,但列名使用AS别名。更喜欢使用CONCAT来连接字符串,而不是+,因为它更符合逻辑地处理NULL