2013-05-18 5 views
0

쿼리를 실행할 때 오류가 발생했습니다. 나는 그 문제가 무엇인지 모릅니다. 두 개 이상의 부서에서 직원을 찾으려면 DB를 쿼리하려고합니다. (예 : Staff_ID = 1, DEPT_ID = 4 및 6에서 작동 함). 관련된 세 개의 테이블이 있습니다둘 이상의 부서 직원 쿼리

다음
1. STAFF 
2. DEPARTMENT 
3. STAFF_DEPT (contains ID of STAFF and DEPT) 

내가 한 일이다,

SELECT 
sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", 
d.DEPT_NAME AS "Department" 
FROM STAFF_DEPT sd 
INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID 
INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID 
GROUP BY sd.STAFF_ID 
HAVING COUNT (sd.STAFF_ID) > 1 
+0

우리가 "오류"로 시작시겠습니까 당신은 있어요? – Bryan

+0

@BryanMoyles 오라클에 대한 견해를 만들었고 성공했습니다. 그러나 '데이터'아래의보기를 보려고하면 SQL 쿼리를 구문 분석하지 못했습니다. ORA-04063 : 뷰 "VU_STAFF_DEPT"에 오류가 있습니다 – bn60

답변

2

여기에 원래의 쿼리입니다. 여러 부서의 직원을 찾고 있습니다. 당신은 사용 부서의 목록 인당 하나 개의 행을 얻을 수 있습니다 :

SELECT sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", 
     list_agg(d.DEPT_NAME, ',') within group (order by DEPT_NAME) AS "Department_List" 
FROM STAFF_DEPT sd 
INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID 
INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID 
GROUP BY sd.STAFF_ID, s.STAFF_Name 
HAVING COUNT (sd.STAFF_ID) > 1; 

공지 사항 : 나는 group byselect에서 list_agg()s.staff_name를 추가했습니다. 당신은 한 사람/행당 부서를 원하는 경우에

는 다음 분석 함수와 하위 쿼리를 사용

selectsd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", dept_name 
from (select sd.staff_id, s.staff_name, d.dept_name, 
      count(*) over (partition by sd.staff_id, s.staff_name) as NumDepts 
     FROM STAFF_DEPT sd 
     INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID 
     INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID 
    ) t 
where NumDepts > 1; 
+0

의견에 감사드립니다. 첫 번째 코드는 한 사람을위한 부서 목록을 얻으 려 할 때 필요한 것입니다. 하지만 문제는 오라클 11.2를 사용하지 않는다는 것입니다. 그렇지 않으면 완벽하게 작동합니다. 필자는 Oracle 10g를 사용 중이므로 COLLECT를 사용해야합니다. ( – bn60

+1

쿼리의 분석 함수 버전에서'list_agg'는'listagg'이어야합니다. –

0

시도하십시오 :

SELECT 
    sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", 
    d.DEPT_NAME AS "Department" 
FROM STAFF_DEPT sd 
    INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID 
    INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID 
GROUP BY sd.STAFF_ID || ' ' || s.STAFF_NAME, d.DEPT_NAME 
HAVING COUNT (sd.STAFF_ID) > 1 
+0

의견을 보내 주셔서 감사합니다. 나는 그것을 시도하고 구문 분석 오류가 없습니다. 그러나, 그것을 실행할 때 볼 데이터가 없습니다. – bn60

+0

btw, STAFF_ID는 숫자 순서가 아니며 varchar입니다 (예 : JB007). – bn60

+0

내 생각 엔 상관 없습니다. – TechDo

1

이 하나의 시도 :

with temp as 
(select sd.staff_id from staff_dept sd 
group by staff_id 
having count(staff_id)>1) 
select tp.staff_id||' ' ||s.Name AS "Staff Name", d.DNAME 
FROM temp tp, 
staff_dept sd, 
staff s, 
dept d 
where tp.staff_id=sd.staff_id 
and sd.staff_id=s.id 
and sd.dept_id=d.deptno; 

내가 가진 staff_id의 개수가 1보다 많아서 임시보기를 사용하고 최종 선택 쿼리에 사용됩니다.

이전에 techdo에게 sd.STAFF_ID로 그룹화 할 수 없다고 언급 했으므로 || ''|| s.STAFF_NAME, d.DEPT_NAME은 항상 고유하므로 1로 계산됩니다.

SELECT sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", 
     d.DEPT_NAME AS "Department" 
FROM STAFF_DEPT sd 
INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID 
INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID 
GROUP BY sd.STAFF_ID 
HAVING COUNT (sd.STAFF_ID) > 1; 

쿼리에 대한 문제는 당신이 staff_id에 집계을하고 있다는 것입니다,하지만 당신은 열 당신의 집계에 staff_namedept_name 있습니다