sql - यदि अन्य पैरामीटर शून्य है, तो एसक्यूएल सही तरीके से जुड़ता है




sql-server (5)

इससे आप कार्य शुरू कर पाएंगे:

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

मेरे पास यह कोड और इसकी अस्थायी टेबल हैं ताकि आप इसे चला सकें।

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

तो जैसा कि आप देख सकते हैं कि लेब्रोन जेम्स क्विज एनबीए टॉप 10 3 पॉइंट शूटर क्विज लेता है और स्टीफन करी एनबीए 50 महानतम खिलाड़ी क्विज लेता है।

मैं बस यही चाहता हूं कि वे इस बात को प्राप्त करें कि लेबरन ने अभी तक 50 सबसे महान खिलाड़ी क्विज नहीं लिया है, इसलिए मुझे जो चाहिए वह इस तरह है।

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

मुझे 2 पैरामीटर्स चाहिए, लेब्रोन की आईडी और क्विज की आईडी ताकि मुझे पता चल जाए कि लेब्रोन या स्टीफन ने अभी तक इसे नहीं लिया है, लेकिन मैं यह कैसे करूंगा कि अगर 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

select s.firstname, s.lastname, q.id as not_taken_quiz_id, q.quiz_name as not_taken_quiz_name
from #student s
left join #quiz_details qd on s.id = qd.student_id
left join #quiz q on q.id <> qd.quiz_id

यह आपको प्रत्येक छात्र को क्विज़ के साथ देगा जो उन्होंने नहीं लिया है।


मेरा इस पर लेना - एक क्रॉस जॉइन के साथ पैट्रिक के जवाब के समान है।

पूर्ण नमूना 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;

इस

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

संपादित करें: कोड को स्पष्ट cross join बजाय बदले में निहित किया गया, दोनों को तुलना के लिए यहां छोड़ दिया गया

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

SELECT   Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM     Orders
JOIN     LineItems
ON       LineItems.LineItemGUID =
         (
         SELECT  TOP 1 LineItemGUID 
         FROM    LineItems
         WHERE   OrderID = Orders.OrderID
         )

SQL Server 2005 और ऊपर में, आप केवल CROSS APPLY साथ INNER JOIN को प्रतिस्थापित कर सकते हैं:

SELECT  Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description
FROM    Orders
CROSS APPLY
        (
        SELECT  TOP 1 LineItems.Quantity, LineItems.Description
        FROM    LineItems
        WHERE   LineItems.OrderID = Orders.OrderID
        ) LineItems2




sql sql-server