0

テーブル内で一意のタプルを見つけなければならないという質問がありますが、それらは別のテーブル内では見られませんでした。次に、それらのタプルを数えて、10 回以上出現するタプルを表示する必要があります。つまり、ジョブ スタッフを必要としないジョブがいくつかあります。これまでにジョブ スタッフを必要とせず、10 回以上実行されたジョブを見つけます。

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 つの余分な行を返すようです。講師に聞いたところ、時々コースを数えているからだと彼は言いました。

編集:これは、仕事が利用可能だったすべての期間について、それに割り当てられた仕事スタッフがいなかったことを意味します

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
4

1 に答える 1

2

クエリを設計する前に、SQL の動作を理解する必要があります。

あなたの質問では、あなたが探していると書いていますがjobsjobstuffここに答えがあるので、あなたが探していたのは明らかbranchesですjobstuff。あなたへの私のアドバイスは次のとおりです。それを実装しようとする前に、あなたが望むものを正確に(あなたの言語で、または英語ではなくSQLではなく)言葉にしてください。経験が豊富な場合は必ずしも必要ではありませんが、初心者にとっては SQL を学ぶための最良の方法です。

ソリューション:

ここで重要なことは、クエリをカスケードするのにビューは必要なく、から選択するだけでよいということですinner queries。また、計算された値 ( など) に基づいて要素をフィルター処理することも、句countによって実行できます。having

これcount(DISTINCT ...)により、重複するエントリが 1 回だけカウントされるため、ジョブが用語内に 2 回ある場合、1 回だけカウントされるようになりました。

以下のクエリbranchesは、これまでに を取得したものをすべて選択し、このリストにないものをjobstaff探します。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
于 2012-04-19T12:39:54.837 に答える