2012-04-19 4 views
0

나는 다른 테이블 내부에서 본 적이없는 테이블에서 고유 튜플을 찾아야하는 질문이 있습니다. 나는 그 튜플을 세 어서 10 번 이상 발생하는 튜플을 표시해야합니다. 즉, 직무 직원을 필요로하지 않는 직무가 있습니다. 직무 직원을 필요로하지 않은 직무를 찾고 있으며, 10 번 이상 근무했습니다. 이것은 두 개의 별도의 행 예상 된 결과를 반환하는 것Postgresql 고유 튜플을 찾고 계산하기

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; 

:로

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

는 기본적으로 내 코드가 존재한다. 내 강사를 물어 그는 내가 과정을 믿는다 때문에 그것이 있다고 말했다 가끔

편집 :이 모든 조건에 대한 작업이 어떤 작업 직원이

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에없는 그 jobs 찾고있는 쓰기 그러나 지금 우리가 여기에 답을 가지고, 당신은 branches 찾고 있다고는 명확 jobstuff에없는 그. 내 충고는 다음과 같습니다. 구현하기 전에 원하는 것을 정확하게 (언어 또는 영어로만 표시 할 수있는) 시간을 가지십시오. 언제나 초보자를 위해 SQL을 배우는 가장 좋은 방법은 필요하지는 않습니다.

해결책은 :

여기 것은 당신이, 당신은 단지 inner queries에서 선택할 수있는 쿼리를 계단식으로 뷰를 필요가 없다는 것입니다. 또한 계산 된 값 (예 : count)을 기반으로 요소를 필터링하려면 having 절을 사용해야합니다.

count(DISTINCT ...)은 중복 항목을 한 번만 계산하므로 하나의 작업이 두 번 용어에 포함되면 이제는 한 번만 계산됩니다.

아래의 쿼리는 모두 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 jobbranches를 모두 선택하십시오 10 가지 용어로되어 있으며 구직자에게 배정되지 않았습니다. 만큼 당신이 작동해야합니다 행을 복제하지 않는 한. (욥이 두 번 임기를 맞출 수 있습니까?) –

+0

@SNpn 작업이 한 학기에 두 번 있었던 상황을 처리 할 수 ​​있도록 코드를 변경했습니다. 지금은 작동합니까? –

관련 문제