2017-11-23 10 views
0

私は手動でSQLクエリを書くのが初めてです。私は解決できないような演習をしています。SQLエクササイズ - これを解決できないようです。

私はこれを解決するために必要なツールを理解していますが、私は単に解決策を思いつくことはできません。

これを解決する方法を理解するのを助けて、私が将来同様の練習問題を解決できるようにすることができますか?

は、私は次の表を持っている:

CREATE TABLE Employee (
    Eid SERIAL primary key, 
    Ename character varying(30) NOT NULL, 
    salary integer DEFAULT 0 NOT NULL 
); 

CREATE TABLE Project (
    Pid SERIAL primary key, 
    Pname character varying(30) NOT NULL, 
    requiredWorkers integer DEFAULT 0 NOT NULL 
); 

CREATE TABLE workson (
    Eid integer references Employee(eid), 
    Pid integer references Project(pid), 
    Primary Key (Eid,Pid) 
); 

演習:

いくつかのプロジェクトが同じ名前(まだ別のPID)を持っていることがあります。従業員の を返します。従業員は、働いているすべてのプロジェクトに正確に同じ名前の を持っています。少なくとも1つのプロジェクトで働く従業員だけを返す。

+1

を使用することです* 1つのプロジェクトのみ。 (ある従業員が1つのプロジェクトにのみ従事している場合、それらのプロジェクトの名前はすべて同じです)その従業員を明確に除外するには、少なくとも1つのプロジェクト*で働く従業員を返却する*代わりに少なくとも2つのプロジェクト*で実行します。 –

答えて

3

あなたが例えばNOT EXISTS

select distinct w1.eid 
from Project p1 
join workson w1 on p1.pid = w1.pid 
where not exists(
    select 1 
    from Project p2 
    join workson w2 on p2.pid = w2.pid 
    where w1.eid = w2.eid and p2.pname != p1.pname 
) 

を使用することができ、別の解決策は、それはあなたが上で勤務する従業員の名前を返すことになっているかどうかは明らかではありませんGROUP BYHAVING

select w.eid 
from Project p 
join workson w on p.pid = w.pid 
group by w.eid 
having count(distinct p.pname) = 1 
関連する問題