2012-04-19 17 views
0

私はテーブル内でユニークなタプルを見つけなければいけません。私はそれらのタプルを数え、10回以上出現するタプルを表示しなければなりません。つまり、職員を必要としない仕事がいくつかあります。職員を一度も必要としていない仕事を見つけ、10回以上実行しました。Postgresql固有のタプルを見つけて数えよう

create table JobStaff (
    Job   integer references Job(id), 
    staff  integer references Staff(id), 
    role  integer references JobRole(id), 
    primary key (job,staff,role) 
); 

create table Job (
    id   integer, 
    branch  integer not null references Branches(id), 
    term  integer not null references Terms(id), 
    primary key (id) 
); 

基本的に私のコードのように存在している:

CREATE OR REPLACE VIEW example AS 
SELECT * FROM Job 
WHERE id NOT IN (SELECT DISTINCT jobid FROM JobStaff); 

create or replace view exampleTwo as 
select branch, count(*) as ct from example group by 1; 

create or replace view sixThree as 
select branch, ct from exampleTwo where ct > 30; 

これは、期待どおりの結果を2つの余分な行を返すように思われます。私は私の講師を頼み、彼は私がコースを数えてるからだと言っているSOMETIMES

EDIT:これは、すべての条件のためにジョブが何の仕事のスタッフは、それが

EDIT2に割り当てられていないがあった、利用可能であったことを、意味します。予想される出力と、私は何を得る:

私が得たもの:

branch | cou 
---------+----- 
    7973 | 34 
    7978 | 31 
    8386 | 33 
    8387 | 32 
    8446 | 32 
    8447 | 32 
    8448 | 31 
    61397 | 31 
    62438 | 32 
    63689 | 31 

が期待:

branch | cou 
---------+----- 
    7973 | 34 
    8387 | 32 
    8446 | 32 
    8447 | 32 
    8448 | 31 
    61397 | 31 
    62438 | 32 
    63689 | 31 
+0

ですか? (宿題タグを追加してください) –

+0

ジョブが参照されている回数、つまり参照されていない回数を知りたいですか?あなたの例では、 'ジョブ'に '役割'があることが示されていません(ただし、あなたが選択したようです)。あなたのデータを修正してください。 –

+0

@AngeloNeuschitzer私は今それを修正しました。 – SNpn

答えて

2

SQLは、クエリを設計する前に必要なものを知っている必要がある方法で動作することを理解する必要があります。

あなたが jobstuffにない branchesを探していたことをあなたが jobstuffではありませんが、今、私たちはここに答えを持っていることを jobsを探していることを書き、あなたの質問に

、その明確な。私のアドバイスは:あなたの言葉を(あなたの言葉で、あるいは英語ではなくSQLではなく)正確にあなたがそれを実装しようとしているものを言いたいことがあります。あなたはいつも初心者のためには、SQLを学ぶための最善の方法は必要ではありません経験豊富なとき。

ソリューション:

ここの事は、あなたがちょうどinner queriesから選択することができ、クエリをカスケード接続するビューを必要としないことです。計算された値(countなど)に基づいて要素をフィルタリングすることは、having節で行うこともできます。

count(DISTINCT ...)は、重複したエントリが1回だけカウントされるようにします。そのため、ジョブが1回の用語に2回含まれていると、1回だけカウントされます。

以下のクエリはjobstaffを受け取ったすべてのbranchesを選択し、次にこのリストにないjobsを検索します。

限り、私はあなたの質問を理解できるように、これはあなたを助ける必要があります。この宿題は

SELECT branch, count(DISTINCT term_id) as cou 
FROM jobs j 
WHERE j.branch NOT IN (SELECT branch FROM job WHERE job.id IN (select jobid FROM jobstaff)) 
GROUP BY branch 
HAVING count(DISTINCT term_id) > 10 
+0

でも、この回答を試しても、私はまだ8行になるはずですが、10行を取得しました。私はそれをやり遂げることはできませんでした。しかし、あなたのメソッドは、私のビューを読みやすくします。 – SNpn

+0

select select jobbranches職場に割り当てられていない10の言葉であった。あなたが動作するはずの行を複製しない限り、 (1つのジョブが2回の言葉で使えますか?) –

+0

@SNpnジョブが2回あった状況を処理できるようにコードを変更しました。 –

関連する問題