我有这个代码及其临时表,所以你可以运行它.
create table #student
(
id int identity(1,1),
firstname varchar(50),
lastname varchar(50)
)
create table #quiz
(
id int identity(1,1),
quiz_name varchar(50)
)
create table #quiz_details
(
id int identity(1,1),
quiz_id int,
student_id int
)
insert into #student(firstname, lastname)
values ('LeBron', 'James'), ('Stephen', 'Curry')
insert into #quiz(quiz_name)
values('NBA 50 Greatest Player Quiz'), ('NBA Top 10 3 point shooters')
insert into #quiz_details(quiz_id, student_id)
values (1, 2), (2, 1)
drop table #student
drop table #quiz
drop table #quiz_details
Run Code Online (Sandbox Code Playgroud)
因此,你可以看到勒布朗詹姆斯参加测验nba前10名3分射手测验和斯蒂芬咖喱参加nba 50最伟大的球员测验.
我想要的只是得到他们没有采取的东西,例如勒布朗没有采取50个最伟大的球员测验,所以我想要的是这样的.
id quiz_name firstname lastname
----------------------------------------------------
1 NBA 50 Greatest Player Quiz NULL NULL
Run Code Online (Sandbox Code Playgroud)
我想要2个参数,lebron的id和测验的id,这样我就知道lebron或者stephen还没有接受它,但是如果它的值student_id仍然是null ,我该怎么办呢?
我的尝试:
select
QD.id,
Q.quiz_name,
S.firstname,
S.lastname
from
#quiz_details QD
inner join
#quiz Q on Q.id = QD.quiz_id
inner join
#student S on S.id = QD.student_id
Run Code Online (Sandbox Code Playgroud)
SAS*_*SAS 13
这应该让你开始:
-- filter out the student and quiz you want
DECLARE @qid INT = 1
DECLARE @sid INT = 1
SELECT *
FROM #student AS s
INNER JOIN #quiz AS q -- you want the quiz
ON 1=1
LEFT OUTER JOIN #quiz_details AS qd -- left join here to get result where rows not found
ON qd.id = q.id
AND qd.student_id=s.id
WHERE s.id = @sid
AND q.id = @qid
AND qd.id IS NULL -- only return quizes not taken
Run Code Online (Sandbox Code Playgroud)
很确定你想要这些东西.这将为您提供测验值,并在没有匹配数据时为学生和quiz_details返回NULL.
select *
from #quiz q
left join #quiz_details qd on q.id = qd.quiz_id
left join #student s on s.id = qd.student_id
Run Code Online (Sandbox Code Playgroud)