2016-04-09 6 views
0

タイトルに「python」という単語を含むデータベース内のすべての書籍を書き込む著者を表示するビューを作成しました。私が持っている問題は、複数の著者がいる場合は何も返さないということです。これはビューの作業コードです。集計関数(count)を使用してサブクエリを実装するかEXISTSを使用する必要がありますが、どのように動作させるかはわかりません。SQL - 一意な答えのみを返すクエリを選択します。

CREATE VIEW sole_python_author(author_first_name, author_last_name) 
AS SELECT first_name, last_name 
FROM authors, books 
WHERE authors.author_id = books.author_id AND 
    title LIKE '%Python%' 
GROUP BY authors.author_id; 

「著者のテーブル:

CREATE TABLE "authors" (
    "author_id" integer NOT NULL, 
    "last_name" text, 
    "first_name" text, 
    Constraint "authors_pkey" Primary Key ("author_id") 
); 

'ブック' テーブル:

CREATE TABLE "books" (
    "book_id" integer NOT NULL, 
    "title" text NOT NULL, 
    "author_id" integer REFERENCES "authors" (author_id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE, 
    "subject_id" integer REFERENCES "subjects" (subject_id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE , 
    Constraint "books_id_pkey" Primary Key ("book_id") 
); 

に 'パイソン' で本を書いた唯一の著者がある場合タイトル、それらの名前を返す必要があります。複数ある場合は、何も返さないはずです。 ご協力いただければ幸いです!

+1

両方のテーブルにいくつかのデータを表示することはできますか?最高の場合、フィドルを準備してください:http://sqlfiddle.com/#!15 – dnoeth

+0

@dnoethこの情報を含めるように質問を更新します – Brittany

答えて

1

他の著者がいない場合は、行を返すだけですか?

私はこれがあなたの記述と一致すると思う:

SELECT min(a.first_name), min(a.last_name) 
FROM authors AS a JOIN books AS b 
ON a.author_id = b.author_id 
WHERE b.title LIKE '%Python%' 
HAVING COUNT (DISTINCT b.author_id) = 1; 
+0

あなたは 'group by'を望んでいませんか? –

+0

@ GordonLinoff:いいえ、これはPhyton-bookを1つしか書いていない著者(olesaknの答えを参照)を返します。しかし、Phytonの作者が1人しかいない場合は行が必要ですが、著者が複数いる場合は行がありません。 – dnoeth

0
CREATE VIEW sole_python_author(author_first_name, author_last_name) 
AS 
SELECT first_name, last_name 
FROM authors, books 
WHERE authors.author_id = books.author_id 
AND title LIKE '%Python%' 
GROUP BY first_name, last_name 
HAVING COUNT(*) = 1 
+1

これはすべてのケースで機能しません。姓と名は同じだがIDは異なる複数の著者がいるかもしれない。 –

0

名前にはPythonで本を書いた著者および無共著者をしたい場合は、私はあなたが本レベルで集約する必要があると思う、ありません著者レベル:

MAX()は一列のみで作業しているので、これは動作します
CREATE VIEW sole_python_author(author_first_name, author_last_name) AS 
    SELECT DISTINCT MAX(first_name), MAX(last_name) 
    FROM authors a JOIN 
     books b 
     ON a.author_id = b.author_id 
    WHERE a.title LIKE '%Python%' 
    GROUP BY b.book_id 
    HAVING COUNT(*) = 1; 

SELECT DISTINCTは、著者が複数のこのような本を書いている可能性がありますが、その名前は一度だけ(おそらく)必要とするからです。注:これは、レベルがauthor_idではなく、著者名レベルでの識別性を求めていることを前提としています。

あなたの質問はあいまいです。これは質問に答えています: "タイトルの中に" Python "を持つ本の唯一の作者は何ですか?

+0

私の言葉がそこではあまりうまくいかなかったのを見て、ごめんなさい。つまり、同じ著者によって書かれたタイトルにPythonを含む2つの書籍がある場合、その著者を返すことになるということです。しかし、異なる著者によって書かれたタイトルに2つのPythonの書籍があれば、何も返されません – Brittany

関連する問題