2016-04-09 46 views
0

Başlıktaki 'python' kelimesiyle veritabanındaki tüm kitapları yazan yazarın gösterilmesi için bir görünüm oluşturdum. Sahip olduğum konu, birden fazla yazar varsa hiçbir şey döndürmemesi. Bu, görünümün çalışma kodu, toplama işlevlerini (sayımı) kullanarak bir alt soruyu ya da EXIST'leri kullanmam gerektiğini biliyorum, ancak nasıl çalıştığını bilmiyorum.SQL - Yalnızca benzersiz bir yanıt veya hiçbir şey döndürmek için sorguyu seçin

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; 

'yazarların tablosu:

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

' kitapların tablosu:

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") 
); 

yılında 'piton' olan bir kitap yazmış tek yazar varsa başlık, isimlerini iade etmelidir. Birden fazla varsa, hiç bir şey vermemelidir. Herhangi bir yardım çok takdir edilecektir!

+1

İki tablodan bazı veriler gösterebilir ve beklenen sonuç nedir? En iyi durumda bir keman hazırlayın: http://sqlfiddle.com/#!15 – dnoeth

+0

@dnoeth Bu bilgiyi – Brittany

cevap

1

Başka bir yazar yoksa yalnızca bir satır döndürür?

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

Bir 'group by' istemediğinden emin misin? –

+0

@GordonLinoff: Hayır, bu sadece tek bir Phyton kitabını yazan yazarlara dönecektir (bkz. Olesakn'ın cevabı). Ama sadece bir tane Phyton yazarı varsa bir satır istiyor, ama eğer birden fazla yazar varsa sıra yok. – 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

içerecek şekilde güncelleyeceğim Bu, tüm durumlar için işe yaramaz. Aynı ad ve soyadı ancak farklı kimlikleri olan birden çok yazar olabilir. –

0

adda Python ile kitap yazdım yazarları istiyorsanız ve hiçbir yazarlar, o zaman, kitap düzeyinde değil bir araya getirmek için gerek: Bence

Bu tanıma uyan yazar seviyesi:

MAX() tek satır üzerinde çalışıyor, çünkü bu işleri
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; 

. Bir yazar birden fazla tür kitap yazdım çünkü

SELECT DISTINCT, ama yalnızca bir kez (muhtemelen) adını istiyorum. Not: Bu, author_id düzeyini değil, yazar adı düzeyinde farklılık aradığınızı varsayar.

Sorunuzu belirsiz buluyorum. Bu soru şu cevabı veriyor: "Başlıkta" Python "yazan kitapların yazarları nelerdir?"

+0

Benim ifademin orada nasıl harika olmadığını görüyorum, üzgünüm. Demek istediğim, aynı yazarın yazdığı başlıkta python bulunan iki kitap varsa, o yazarın geri döneceği anlamına gelir. Ama farklı yazarlar tarafından yazılan başlıkta iki kitap varsa, hiçbir şey geri dönmezdi. – Brittany