45 votes

SQL façon correcte de se joindre si l'autre paramètre est nul

J'ai ce code et de ses tables temporaires de sorte que vous pouvez exécuter.

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

Donc, comme vous pouvez le voir lebron james prend le quiz de la nba top 10 3 point de tireurs quiz et stephen curry prend la nba 50 plus grand joueur de quiz.

Tout ce que je veux est d'obtenir la chose qu'ils n'en ont pas encore, par exemple LeBron n'a pas pris les 50 plus grand joueur de quiz donc ce que je veux, c'est comme cela.

id   quiz_name                    firstname  lastname
----------------------------------------------------
1    NBA 50 Greatest Player Quiz  NULL       NULL 

Je veux 2 paramètres, l'id de lebron et l'id du quiz, de sorte que je sais que lebron ou stephen n'a pas pris encore, mais comment ferais-je si la valeur de l' student_id est toujours null?

Ma tentative:

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

13voto

SAS Points 2446

Cela devrait vous faire démarrer:

5voto

Sean Lange Points 23698

Je suis presque sûr que vous voulez quelque chose dans ce sens. Cela vous donnera les valeurs du quiz et de retourner NULL pour l'étudiant et quiz-détails quand il n'y a pas de données correspondantes.

3voto

Patrick Artner Points 29630

lundi

vous donnera


Modifier: changé le code à explicite `` plutôt que implicite, laissant les deux ici pour la comparaison

contre.

2voto

WernerCD Points 564

Mon avis sur elle - semblable à la réponse de Patrick avec une croix rejoindre.

Échantillon complet disponible à sqlfiddle

0voto

<pre><code></code><p>Cela vous donnera chaque élève avec le quiz qu'ils n'ont pas pris.</p></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X