如果其他参数为null,则SQL正确的连接方式

SCr*_*rub 45 sql sql-server

我有这个代码及其临时表,所以你可以运行它.

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)

  • 很好的答案; 我唯一推荐的是使用`cross join`而不是没有连接条件的`inner join`.虽然它们是等价的,但我相信明确地使用`cross join`会更清楚,因为没有条件的`inner join`并不是真正的内连接.它还可以让你摆脱`1 = 1`绒毛 (10认同)
  • ...虽然在WHERE子句中的#quiz上有一个条件,但该条件应上移至该连接(这将阻止在此处使用`CROSS JOIN`) (2认同)

Sea*_*nge 5

很确定你想要这些东西.这将为您提供测验值,并在没有匹配数据时为学生和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)