2017-11-17 6 views
1

私は2つのテーブル、1つの学生のリストと1つのレストランのリストを持っています。 peopleテーブルには、レストランテーブル内にFKとして格納されているPKがあります。レストランのテーブルには、学生がレストランで食事をしたい日と食事をするレストランがあります。私は月曜日にレストランで食べたくない学生を探しています。私は以下の質問を使ってみましたが、月曜日に外食していない学生ではなく、すべての学生をリストアップしています。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

さて、以下しようとしたが、それは好きではないの構文をEXISTS:D INNERがDinnerDay、NOTは '月曜日' をEXISTS D.SID = S.SID ON学生AS S \tを結合としてディナーは異なるSNAME を選択 –

+0

なぜ、 '好きではない'の代わりに '<>'を使用していませんか? NOT EXISTS構文が間違っています。あなたがまだ 'NOT LIKE'を使いたいなら、 'NOT LIKE' Monday% 'を使ってください。 – user6542823

答えて

1

私はあなたがこのために探していると思うには見られない学生を与え、左アウター・ジョインと最後。だから、あなたはどんなレストランでも決して食べない生徒を持つことができます。代わりに、null結合を使用する必要があります。

またDISTINCTにはGROUP BYを指定しました。これは重複を2回削除します。これらのうちの1つを実行するだけです。

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' 

これは、学生が月曜日に食べない場合D.IDにNULLを返す、または任意のレストランで外​​食することはありません。 case文はD.ID IS NOT NULLかどうかをチェックし、そうであればS.SNameを返します。重複を削除するには、この選択はDISTINCTです。

+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はnullです。

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 

サブクエリには、月曜日に添付されたすべての生徒のリストが表示されます。インナー接合条件に一致しない行を削除します参加

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

:句があなたの月曜日のリスト

関連する問題