2017-02-10 6 views
0

テーブル:SQLクエリの問題(正当性チェック)

- ビール(名前、製造業者)
- バー(名前、住所、ライセンス)
- セルズ(バー、ビール、価格)
- 酒飲み(名前、住所、電話)
- 好き(酒飲み、ビール)
- 常連(酒飲み、バー)
- フレンズ(drinker1、drinker2)

タスク:

  1. 二つ以上の飲酒
  2. に好か全てのビールが3つ以上の飲酒
  3. に好か全てのビールがアンナ
  4. の友人たちに好か全てのビールが安いビールを販売するすべてのバーを探す探します

    SELECT x name 
    FROM Beers x, Drinkers y, Likes s  
    WHERE y.name=s.drinker and s.beer=x.name 
    GROUP BY x.name  
    HAVING COUNT(s.drinker) >= 2; 
    
    :バー "99本のボトル"

クエリ#1から販売されているすべてのビールより

クエリ#2:

以前

クエリ#3と同じ。

SELECT x name 
FROM Beers x, Friends y, Drinkers z, Likes p 
WHERE z.name = "Anna" 
    AND z.name = y.drinker1 
    AND y.drinker2 = p.drinker 
    AND p.beer = x.name; 

クエリ#4:

SELECT x.name 
FROM Bars x, Sells y 
WHERE x.name = y.bar 
    AND SOME(SELECT y.price) < ALL(SELECT t.price 
           FROM Sells t 
           WHERE t.bar = "99 bottles"); 

私は最後のものについて少し躊躇しています。私はそのようにSOMEを使用することを許可されましたか? select句に外部変数を使用してサブクエリを作成することはできますか?

+1

[蹴り方が悪い:古いスタイルのジョインを使用](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - ANSI - ** 92 ** SQL標準(** 25年**前)のold * style *カンマ区切りのテーブル*スタイルのリストが*適切な* ANSI 'JOIN'構文に置き換えられました。使用はお勧めしません –

+0

はい、誰も私がSQLを踏みだすとすぐに教えてくれますが、それは私の先生が使っていることです。彼は私たちに、コースの後半でそれについて学ぶことを教えてくれました。 – daniel

答えて

1

3.アンナの友人たちに好かすべてのビールを探す:あなたの答えを持つ2つの主要な問題があります

  • は、クエリが複数回特定のシナリオに比べて同じビールの名前を返すことがあります。
  • 「アンナは」フレンズテーブル
のいずれか drinker1または drinker2列に表示される場合がありますので、あなたは、いくつかのケースを欠場明示 JOIN「Sを用い

Here'aサンプル溶液:

SELECT x.name 
FROM Beers 
WHERE b.name IN (
    SELECT l.beer 
    FROM Likes l 
     INNER JOIN Friends f 
      ON l.drinker = f.drinker1 
    WHERE f.drinker2 = "Anna" 

    UNION 

    SELECT l.beer 
    FROM Likes l 
     INNER JOIN Friends f 
      ON l.drinker = f.drinker2 
    WHERE f.drinker1 = "Anna" 
) 

4。バー "99ボトル"で販売されているすべてのビールよりも安いビールを売っているバーをすべて見つけてください。

あなたはSOMEとALLを間違って使用しています。

  • は、我々は(SELECT y.priceは有効な式ではありません)

  • SOMEまたはALL内部表現は、完全なサブクエリでなければならない比較演算子の両方脇にこれらのキーワードを使用することはありませんサンプル溶液は、INMINを使用しています。

    SELECT b.name 
    FROM Bars b 
    WHERE b.name IN (
    
        SELECT s.bar 
        FROM Sells s 
        WHERE s.price < 
        (
         SELECT MIN(price) 
         FROM Sells 
         WHERE bar = "99 bottles" 
        ) 
    
    ) 
    
  • +2

    ダニエルの宿題をすると、彼は多くを学ぶことはありません... – jarlh

    +0

    こんにちはセルジュ、あなたの答えをどうもありがとうございます。しかし、私の先生が使用しているsintaxは異なっています。私はそれが時代遅れだと知っていますが、中期的にはそのsintaxに基づいています。彼は結局彼が使用しているsintaxを私たちに教えると教えてくれました。私の仕事についてのフィードバックをお願いしますか? – daniel