使用基于外键的左连接仅检索一行
Retrieve only one row using left join based on foreign key
我在数据库中有 2 个关系 table。
一个是Class
create table Class(
CourseId int,
CourseName varchar(50),
LecturerId int,
Class1Time varchar(50),
Class2Time varchar(50),
Class1Place varchar(50),
Class2Place varchar(50)
);
和Lecturer
create table Lecturer(
Id int,
FirstName varchar(50),
LastName varchar(50),
primary key(Id)
);
LecturerId
来自 Class
table 是来自 Lecturer
的 Id
的外键。
我想要的只是 select 来自两个 table 的数据(一行)基于外键 LecturerId
= specefic value
我试过使用左连接
select Class.CourseName, Class.CourseId, Class.Class1Time, Class.Class2Time, Class.Class1Place, Class.Class2Place, Lecturer.Id, Lecturer.FirstName, Lecturer.LastName
from Class
left join Lecturer
on Lecturer.Id = (select Lecturer.Id from Lecturer where LecturerId = Class.LecturerId)
where Class.LecturerId = someValue;
go
但它导致错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
例如在 Lecturer
table 我有一个 Id = 2001
所以我想执行上面的查询,需要 return 下面的结果,比如
CourseName - CourseId - Class1Time - Class2Time - Class1Place - Class2Place - Lecturer Infor(based on the Id)
只有一行。
试试这个,使用 table 别名,所有 列别名。
select C.CourseName, C.CourseId, C.Class1Time, C.Class2Time, C.Class1Place, C.Class2Place, L.Id, L.FirstName, L.LastName
from Class C
left join Lecturer L on L.Id = C.LecturerId
where C.LecturerId = @Id;
您收到该错误的原因是:
(select Lecturer.Id from Lecturer where LecturerId = Class.LecturerId)
其实是一样的:
(select Lecturer.Id from Lecturer where Class.LecturerId = Class.LecturerId)
因为 Lecturer
没有名为 LecturerId
的列,并且因为您没有 table 限定该列,SQL 服务器意识到它确实存在于Class
因此使用它。
并且由于 Class.LecturerId = Class.LecturerId
对于 'Lecturer' table 中的所有记录都是正确的,所以您会返回其所有 ID。
当然,实际上没有理由执行子查询,因为您已经有了要使用子查询获取的值。
请尝试以下操作。
DECLARE @LecturerId INT = 1
SELECT C.CourseName, C.CourseId, C.Class1Time, C.Class2Time, C.Class1Place, C.Class2Place, L.Id, L.FirstName, L.LastName
FROM Class AS C
INNER JOIN Lecturer AS L ON L.Id = C.LecturerId
INNER JOIN
(
SELECT C.CourseId, C.LecturerId
FROM Class AS C
WHERE C.LecturerId = @LecturerId
GROUP BY C.CourseId, C.LecturerId
) AS G ON G.CourseId = C.CourseId AND G.LecturerId = C.LecturerId
我在数据库中有 2 个关系 table。
一个是Class
create table Class(
CourseId int,
CourseName varchar(50),
LecturerId int,
Class1Time varchar(50),
Class2Time varchar(50),
Class1Place varchar(50),
Class2Place varchar(50)
);
和Lecturer
create table Lecturer(
Id int,
FirstName varchar(50),
LastName varchar(50),
primary key(Id)
);
LecturerId
来自 Class
table 是来自 Lecturer
的 Id
的外键。
我想要的只是 select 来自两个 table 的数据(一行)基于外键 LecturerId
= specefic value
我试过使用左连接
select Class.CourseName, Class.CourseId, Class.Class1Time, Class.Class2Time, Class.Class1Place, Class.Class2Place, Lecturer.Id, Lecturer.FirstName, Lecturer.LastName
from Class
left join Lecturer
on Lecturer.Id = (select Lecturer.Id from Lecturer where LecturerId = Class.LecturerId)
where Class.LecturerId = someValue;
go
但它导致错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
例如在 Lecturer
table 我有一个 Id = 2001
所以我想执行上面的查询,需要 return 下面的结果,比如
CourseName - CourseId - Class1Time - Class2Time - Class1Place - Class2Place - Lecturer Infor(based on the Id)
只有一行。
试试这个,使用 table 别名,所有 列别名。
select C.CourseName, C.CourseId, C.Class1Time, C.Class2Time, C.Class1Place, C.Class2Place, L.Id, L.FirstName, L.LastName
from Class C
left join Lecturer L on L.Id = C.LecturerId
where C.LecturerId = @Id;
您收到该错误的原因是:
(select Lecturer.Id from Lecturer where LecturerId = Class.LecturerId)
其实是一样的:
(select Lecturer.Id from Lecturer where Class.LecturerId = Class.LecturerId)
因为 Lecturer
没有名为 LecturerId
的列,并且因为您没有 table 限定该列,SQL 服务器意识到它确实存在于Class
因此使用它。
并且由于 Class.LecturerId = Class.LecturerId
对于 'Lecturer' table 中的所有记录都是正确的,所以您会返回其所有 ID。
当然,实际上没有理由执行子查询,因为您已经有了要使用子查询获取的值。
请尝试以下操作。
DECLARE @LecturerId INT = 1
SELECT C.CourseName, C.CourseId, C.Class1Time, C.Class2Time, C.Class1Place, C.Class2Place, L.Id, L.FirstName, L.LastName
FROM Class AS C
INNER JOIN Lecturer AS L ON L.Id = C.LecturerId
INNER JOIN
(
SELECT C.CourseId, C.LecturerId
FROM Class AS C
WHERE C.LecturerId = @LecturerId
GROUP BY C.CourseId, C.LecturerId
) AS G ON G.CourseId = C.CourseId AND G.LecturerId = C.LecturerId