次のスキーマを使用します。
create table awards(
aid int primary key
, name varchar(100) not null );
create table institutions(
iid int primary key
, name varchar(100) not null );
create table winners(
aid int
, iid int
, year int
, filmname varchar(100)
, personname varchar(100)
, primary key (aid, iid, year)
, foreign key tid references awards(aid)
, foreign key cid references institutions(iid) );
次のクエリを作成しました。
SELECT nominees.personname as personname, awards.name as award, nominees.year as year
FROM nominees, institutions, awards WHERE institutions.iid = nominees.iid and
awards.aid = nominees.aid and personname is not null
GROUP BY nominees.personname, awards.name, nominees.year
HAVING ((awards.name, count(DISTINCT institutions.name)) in
(SELECT awards.name as
awards, count(DISTINCT institutions.name)
FROM nominees, awards, institutions
WHERE nominees.aid = awards.aid and nominees.iid = institutions.iid
GROUP BY awards.name))
ORDER BY nominees.personname, awards.name;
このクエリは、特定の年にその賞を授与したすべての機関から 1 人の人物が指名されたすべての賞を検索するように設計されています。基本的には 1 人で、1 つの賞を与えた機関の数を数え、その値をその賞を与えた機関の最大数と比較します。
目的の出力は次のようになります。
"personname" "award" "year"
"Alexandre" "score" "2011"
"Skyfall" "song" "2013"
"Tangled" "song" "2011"
これにより、私が望むセットが得られますが、別の方法で行う方が効率的かどうかはわかりません。EXISTS で動作させようとしましたが、うまくいきませんでした。
主な質問: このクエリを実行するためのより効率的な方法はありますか?