Sql server 无法在SQL Server中绑定多部分标识符

Sql server 无法在SQL Server中绑定多部分标识符,sql-server,Sql Server,我是SQL Server的新手,我创建了三个表students、phones和stud\u phone student和phone之间的关系很多student\u phone表包含来自student和phone表的两个外键 我想实现的是,我想检索Id1学生的记录和他们各自的手机,但我无法做到这一点 我得到这个错误: 无法绑定多部分标识符 这是我的模式: 我的问题是: select * from student, phone join stud_phone on student.stId =

我是SQL Server的新手,我创建了三个表
students
phones
stud\u phone

student
phone
之间的关系很多
student\u phone
表包含来自
student
phone
表的两个外键

我想实现的是,我想检索Id1学生的记录和他们各自的手机,但我无法做到这一点

我得到这个错误:

无法绑定多部分标识符

这是我的模式:

我的问题是:

select * 
from student, phone
join stud_phone on student.stId = 1
                and student.stId = stud_phone.stId
                and phone.phId = stud_phone.phId
你可能是说:

select * 
from student, phone
join stud_phone on student.stId = 1
                and student.stId = stud_phone.stId
                and phone.phId = stud_phone.phId

用“.”替换学生Id中的“.”:student.stId

也许这就是你的意思:

SELECT s.*, sp.*
FROM student s
INNER JOIN stud_phone sp ON sp.stId = s.stId
INNER JOIN phone p ON p.phId = s.phId
注意:您真的应该考虑在这里转换为更合理的联接样式。ANSI-92现在已经可以喝酒了


这里的s、sp和p是“本地别名”,只是用于减少键入(在其他地方它有有用的好处)。请注意,使用旧式连接是自找麻烦,它会隐式创建一个内部连接(但学生可能有0部手机)

以下查询应返回学生的电话号码。我使用了表别名和ANSI-92连接语法

select s.*, p.* 
from student as s
join stud_phone as sp on s.stId = sp.stId
inner join phone as p on p.phId = sp.phId
where s.stId = 1


更新:如果student和stud\u phone之间的关系是零到多,那么您应该在
student
stud\u phone
表之间使用左连接。

如果您从
JOIN
子句中删除逗号,那么您可能会更容易<代码>。。。从table.field=table2.field join table3 on…的table join table2中,除了混合使用ANSI-89和ANSI-92样式的联接(一个非常糟糕的主意)之外,还存在语法问题。看这里。既不是表也不是列的“stud_phone”。你还真的应该使用别名来让自己更轻松。@sgedes。。。。是的,但我想从两个表中检索记录。首先,要与join语法保持一致,并使用near(已经提供了25年以上)语法。这个问题似乎比连接更复杂。发布数据图片不是一个好计划。为什么?这是一个很好的起点。很抱歉,键入sir时出错,但问题是我想从多对多检索记录,这给了我一个错误此错误“无法绑定多部分标识符”不是多对多问题。这是一个语法错误。我的回答修正了。或者,运行我的代码并发布完整的错误消息。(通常是两行)@Inam,来吧,它是怎么工作的。您没有阅读评论。@Inam,ROFL。你只是一个接一个地把回答标记为答案,而不知道自己在做什么。ROFL——“ANSI-92现在已经可以喝酒了。”你不应该使用内部连接。它假设学生至少有一部手机,但多对多意味着他可能一部也没有。这很好,但如果学生没有手机,它将什么也不返回,因为它是内部连接here@Inam,终于你开始看到了。我一直都想这么说。在我的回答中使用LEFT join。是的,先生,这就是我需要的。你是专业人士,谢谢你,先生:)如果那个学生没有电话怎么办?@Inam,不,这是偶然的。您不应该使用内部联接。@CetinBasoz-您可能是对的,但是OP在查询中有所有的内部联接,所以我只是重写了查询。我想他不只是想说“重写我的查询”。我所说的是正确的,而不是可能的。是的,内部连接在这里是不正确的,如果没有学生的电话,它将不会返回任何结果
select s.*, p.* 
from student as s
join stud_phone as sp on s.stId = sp.stId
inner join phone as p on p.phId = sp.phId
where s.stId = 1