2017-11-17 191 views
1

我有兩張桌子,一張是學生名單,另一張是餐廳名單。人員表格包含PK作爲FK包含在餐館表格中。餐桌包含學生喜歡在餐廳吃飯的日子(以及他們在餐廳吃飯的時間)。我試圖找到週一不喜歡在餐廳用餐的學生。我嘗試使用下面的查詢,但它列出了所有的學生,而不是週一沒有外出的那些學生。MS SQL不喜歡查詢

SELECT DISTINCT SName 
FROM Dinner AS D 
INNER JOIN Student AS S ON D.SID = S.SID  
WHERE DinnerDay NOT LIKE 'Monday' 
GROUP BY SName 
+0

考慮使用'where not exists'查詢。另外,使用'distinct'和'group by'都是不必要的:都返回唯一的'SName'。如果你正在彙總(sum,avg等),使用'group by',如果你只想返回唯一值,使用'distinct'。 – HoneyBadger

+0

好了,嘗試了以下,但它不喜歡的NOT EXISTS語法:SELECT DISTINCT SNAME FROM晚餐d INNER JOIN學生爲S \t ON D.SID = S.SID WHERE DinnerDay NOT EXISTS '星期一' –

+0

你爲什麼不用'<>'來代替'NOT LIKE'?您的NOT EXISTS語法錯誤。如果您仍想使用'NOT LIKE',請使用'NOT LIKE'Monday%'。 – user6542823

回答

1

我認爲你正在尋找這個沒有發現學生:

SELECT DISTINCT SName 
FROM Student AS S 
WHERE NOT EXISTS (
         SELECT  NULL 
         FROM  Dinner AS D 
         WHERE  DinnerDay = 'Monday' 
           AND D.SID = S.SID 
        ) 
+0

我試過這種語法,但它沒有返回任何結果。 –

+0

我犯了一個小錯誤,請參閱編輯。你已經有了一個答案,但它從來沒有傷害有替代品。 – HoneyBadger

+0

真棒,這個工程現在,謝謝一堆 –

0
SELECT DISTINCT SName 
FROM Dinner AS D 
INNER JOIN Student AS S ON D.SID = S.SID  
WHERE DinnerDay <> 'Monday' 

嘗試使用<>

+0

<>似乎沒有解決它,但得到了下面的答案。 –

1

您可以使用學生表和子查詢。子查詢是週一用餐的所有學生的明確列表,然後運行學生和子查詢b的左外連接,其中b.SID爲空;

select S.SName from Student as S 
Left Outer Join 
(select Distinct S2.SID from Student as S2 Inner Join Dinner as D on S2.SID=D.SID where D.DinnerDay='Monday') as tbMonStd 
on S.SID=tbMonStd.SID 
where tbMonStd.SID IS NULL 

子查詢爲您提供了附加到週一所有學生的列表。左外連接和最後的where子句讓你在週一列表

+0

謝謝,這個工作。我只需要分解語法來理解它。再次感謝您 –

0

內部聯接將刪除不就加盟條件相匹配的行。所以你可以讓學生從不吃任何一家餐館,因爲內心的加入會消除這些學生。相反,你應該使用左連接,它將返回null。

你也做了DISTINCTGROUP BY。這是刪除重複兩次。你只需要做其中的一個。

SELECT DISTINCT CASE WHEN (D.ID IS NOT NULL) 
         THEN S.SName 
       END 
FROM Student AS S 
LEFT JOIN Dinner AS D ON S.SID = D.SID AND D.DinnerDay = 'Monday' 

這將返回NULL爲D.ID如果學生沒有在週一吃,或在任何餐廳從來不吃了。案例陳述檢查是否D.ID IS NOT NULL,如果是,則返回S.SName。這個選擇是DISTINCT刪除重複項。