sql title - مزود طريقة صحيحة للانضمام إذا كانت المعلمة الأخرى فارغة




school learn (5)

لدي هذا الرمز وجداوله المؤقتة حتى تتمكن من تشغيله.

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

حتى تستطيع أن ترى lebron james تأخذ مسابقة nba top 10 3 نقطة لإطلاق النار ، وستيفن كاري يأخذ مسابقة nba 50 لأعظم لاعب.

كل ما أريده هو الحصول على الشيء الذي لم يأخذوه بعد ، على سبيل المثال ، لم تحصل LeBron على أفضل 50 مسابقة لاعب ، لذا فإن ما أريده هو هذا.

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

أريد معلمتين ، معرف lebron ومعرف الاختبار حتى أعلم أن lebron أو ستيفن لم student_id بعد ، ولكن كيف أفعل ذلك إذا كانت قيمة student_id لاغية؟

محاولتي:

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

Answers

بلدي تأخذ على ذلك - على غرار جواب باتريك مع صلة الصليب.

عينة كاملة متاحة في sqlfiddle

select
  Q.Quiz_Name Quiz
 ,S.LastName Last
 ,S.FirstName First
 ,QD.Quiz_ID
 ,QD.Student_ID
from 
/* Get a full list of ALL Test/Student combinations */
           quiz Q 
CROSS JOIN student S 
/* Join the taken tests to the combinations */
 LEFT JOIN quiz_details QD on Q.id = QD.quiz_id
                          and S.id = QD.student_id
/* Only select where no Quiz_ID exists */
WHERE QD.Quiz_ID IS NULL
ORDER BY Q.Quiz_Name, S.Lastname, S.FirstName;

هذا يجب عليك ان تبداء:

-- 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

متأكد من أنك تريد شيئا على هذه الخطوط. سيعطيك هذا قيم الاختبار وإرجاع NULL للطالب و quiz_details عند عدم وجود بيانات مطابقة.

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

هذه

Select Q.id , Q.quiz_name ,S.firstname, S.lastname
from 
    #quiz Q                -- cross join, returns N*K results, do not use without 
    CROSS JOIN #student S  -- where condition that limits it - SAS solution is nicer!
where not exists (select 1 from #quiz_details where quiz_id = Q.id and student_id = S.id)

سوف أعطيك

id  quiz_name                         firstname     lastname
1   NBA 50 Greatest Player Quiz       LeBron        James
2   NBA Top 10 3 point shooters       Stephen       Curry

تحرير: تم تغيير الكود إلى صريح صريح بدلاً من ضمني ، وترك كل منهما هنا للمقارنة

SELECT #quiz Q, # student S           -- old implicit syntax - comma is easily missed

ضد.

SELECT #quiz Q CROSS JOIN #student S  -- makes it clearer what is wanted

مثال آخر لماذا SQL ليست محمولة حقا.

بالنسبة إلى MySQL ، سيكون:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

لمزيد من المعلومات ، اقرأ تحديث جدول متعدد: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]






sql sql-server