2017-01-06 4 views
0

私は自分自身でStudyでいくつかの練習をしていますが、私はサブ集団でこの練習問題 を見つけました。集計文と条件文の両方を使用しているSQL

http://studybyyourself.com/seminar/sql/exercises/7-1/?lang=en

私が初めてそれが間違ってました(私は著者の名前とWHERE文を入れて)、その後、私は解決策を確認し、それはだから私はそれがに大丈夫だと仮定し

SELECT * 
FROM Author AS a 
INNER JOIN Writing AS w ON w.Author_id = a.ID 
INNER JOIN Book AS b ON b.ID = w.Book_id 
GROUP BY b.ID 
HAVING COUNT(*) = 1 AND a.Last_Name = 'Duncan' AND a.First_name = 'Andrew' 

ました条件付きの非集約文を、HAVING文の集約とペアにしておく限り、それを入れますか?

私はグループ化する前にフィルタを適用する WHERE句のもの JOIN条件が発生する可能性がありますとだけ HAVING句でフィルタをグループ化または凝集している HAVING句のフィルタ条件は、集計結果に適用されますので、その目的のために意図されている移動言うでしょう
+0

互換性のないデータベースタグを削除しました。実際に使用しているデータベースにタグを付けてください。 –

+0

これはうまくいきますが、可能なすべてのフィルタリングを行うには 'where'節が好きです。私は要約フィルタリングを行うのが好きです – zedfoxus

答えて

2

WHERE a.Last_Name = 'Duncan' AND a.First_name = 'Andrew' 
GROUP BY b.ID 
HAVING COUNT(*) = 1 
+0

それは正しく質問に答えません。 –

+1

あなたがSQLを学習しようとしているなら、この答えは明らかに優れています。これは、この問題を解決する正しい方法です。 'HAVING'節はあなたの集合体の' WHERE'文のようなものです。あなたがしたいのは、1つの本しか書いていないAndrew Duncanの行を返すようにクエリを制限することです。 これは、データベース設計とクエリロジックの両方にとって非常に恐ろしい例です。 @ Rahulはあなたにこのタスクを達成するための正しい方法を提供するのに役立っています。練習が探していたのは、あなたがHAVING節を使う方法を理解していたことでしたが、それは貧弱な例でした。 –

1

SQLの詳細については、別の場所を参照してください。その文は構文的にも論理的にも正しくありません。

正しい解決策は、より次のようになります。b以外のテーブルから

SELECT . . . 
FROM Author AS a INNER JOIN 
    Writing AS w 
    ON w.Author_id = a.ID INNER JOIN 
    Book AS b 
    ON b.ID = w.Book_id 
GROUP BY b.ID 
HAVING COUNT(*) = 1 AND 
     MAX(a.Last_Name) = 'Duncan' AND 
     MAX(a.First_name) = 'Andrew'; 

列は、(適切に言えば)必要がありますまた、集計機能を持っています。

関連する問題