2016-11-11 2 views
1

Oracle 10g 디자이너 및 sqlplus를 사용하는 데이터베이스 시스템에서 작업 중 작성해야하는 쿼리가 많지만 쉽지만 대부분 문제가 있습니다.sqlplus의 다중 중복 행

나는 실제로 17 행의 데이터를 반환해야 할 때 실행시 데이터 204 행을 반환한다는 쿼리가 있습니다. 행 자체가 12 배 반복됩니다. 나는 이것에 대해 내 머리를 감쌀 수 없다. 시간이되었습니다. 내 코드, 쿼리 모양 (scs 형식), ERD, 결과의 스크린 샷 및 설명 계획 테이블 출력의 스크린 샷을 제출합니다. 반복 행은 마지막 열 10 개 결과입니다.

아무도 도와 줄 수 있습니까?

COLUMN C_FNAME FORMAT A10 
COLUMN C_LNAME FORMAT A10 
COLUMN C_ORG FORMAT A35 
COLUMN C_ADR FORMAT A35 
COLUMN C_CNUM FORMAT 9999999 
COLUMN E_ID FORMAT A7 
COLUMN E_NAME FORMAT A35 
COLUMN E_FTIME FORMAT A21 
COLUMN E_STIME FORMAT A21 
COLUMN ET_DESC FORMAT 10 
COLUMN V_NAME FORMAT A30 
COLUMN V_ADDRESS FORMAT A35 
COLUMN V_CNUM FORMAT 9999999 
COLUMN D_DESC FORMAT A30 
COLUMN D_AMT FORMAT A3 
COLUMN ST_DESC FORMAT A15 
COLUMN S_FNAME FORMAT A15 
COLUMN S_LNAME FORMAT A15 
COLUMN EQ_TYPE FORMAT A15 
COLUMN EQ_DESC FORMAT A15 
COLUMN EQ_AMT FORMAT A3 
COLUMN SU_NAME FORMAT A40 
BREAK ON C_FNAME ON C_LNAME ON C_ORG ON C_ADR ON C_CNUM ON E_ID ON E_NAME ON E_STIME ON E_FTIME ON ET_DESC ON V_NAME ON V_ADDRESS ON V_CNUM ON D_DESC ON D_AMT ON EQ_TYPE ON EQ_DESC ON EQ_AMT ON SU_NAME 
SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM, D_DESC, D_AMT, ST_DESC, S_FNAME, S_LNAME, EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME 
FROM CUSTOMER, EVENTTYPE, STAFFTYPE, VENUE, EVENT, STAFF, EVENT_DISHES, EVENT_EQUIPMENT, EVENT_STAFF, DISHES, EQUIPMENT, SUPPLIER 
WHERE E_ID ='E000001' 
AND CUSTOMER.C_ID = EVENT.C_C_ID 
AND EVENTTYPE.ET_ID = EVENT.ET_ET_ID 
AND VENUE.V_ID = EVENT.V_V_ID 
AND EVENT_DISHES.E_E_ID = EVENT.E_ID 
AND EVENT_DISHES.D_D_ID = DISHES.D_ID 
AND EVENT_EQUIPMENT.E_E_ID = EVENT.E_ID 
AND EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID 
AND EQUIPMENT.SU_SU_ID = SUPPLIER.SU_ID 
AND EVENT_STAFF.E_E_ID = EVENT.E_ID 
AND EVENT_STAFF.S_S_ID = STAFF.S_ID 
AND STAFF.ST_ST_ID = STAFFTYPE.ST_ID; 

enter image description here

enter image description here

enter image description here

enter image description here

+0

저는 sqlplus를 처음 사용합니다. 나는 따라갈 것을 배우고 있습니다 –

+0

실행 계획을 제공 할 수 있습니까? 'explain plan for '을 실행하고 완료되면 'select * from table (dbms_xplan.display);'을 실행하십시오. 출력을 질문에 추가하십시오. –

+0

좋은 하루 되십시오. 당신의 응답을 주셔서 감사합니다. 요청한 정보를 추가했습니다. –

답변

0

당신이 WHERE 대신 =으로는 ANSI 호환 사용하도록 쿼리를 재구성 조인 구문을 경우가 더 쉬울 수 있습니다 절.

SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM, D_DESC, D_AMT, ST_DESC, S_FNAME, S_LNAME, EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME 
FROM customer 
INNER JOIN event ON CUSTOMER.C_ID = EVENT.C_C_ID 
INNER JOIN eventtype ON EVENT.ET_ET_ID = EVENTTYPE.ET_ID 
INNER JOIN venue ON EVENT.V_V_ID = VENUE.V_ID 
INNER JOIN EVENT_DISHES ON EVENT.E_ID = EVENT_DISHES.E_E_ID 
INNER JOIN DISHES ON DISHES.D_ID = EVENT_DISHES.D_D_ID 
INNER JOIN EVENT_EQUIPMENT ON EVENT.E_ID = EVENT_EQUIPMENT.E_E_ID 
INNER JOIN EQUIPMENT ON EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID 
INNER JOIN SUPPLIER ON SUPPLIER.SU_ID = EQUIPMENT.SU_SU_ID 
INNER JOIN EVENT_STAFF ON EVENT.E_ID = EVENT_STAFF.E_E_ID 
INNER JOIN STAFF ON STAFF.S_ID = EVENT_STAFF.S_S_ID 
INNER JOIN STAFFTYPE ON STAFFTYPE.ST_ID = STAFF.ST_ST_ID 
WHERE E_ID ='E000001'; 

것은 나는 당신의 데이터가 이제 잘못된 이유에 찾고 있어요, 그러나 이것은 시작하는 장소입니다.

event_equipment 및 suppliers 테이블에 대한 조인에 문제가 있다고 생각합니다. 해당 테이블에서 데이터가 고유합니까?

+0

선생님, 저는 귀하의 솔루션을 시도했으며 결과는 동일한 204 행이 반환되었습니다. 독특한? 잘 event_equipment 테이블에는 각 이벤트의 ID, 각 장비의 ID 및 이벤트 당 사용 된 장비의 AMT가 저장됩니다. –

2

반환되는 204 개의 행은 쿼리 결과의 정확한 금액입니다. 직원이 17 명입니다 (유형은에서 파생 된 것임). 이 17 개의 행에 2 개의 곱셈이 곱해지고 2 개의 고용 된 4 개의 필수 (2 + 4 = 6) equipement가 곱 해집니다. 따라서 17 * 2 * 6은 204 행을 제공합니다.

EVENT_DISHES는 지금까지 17 개의 기존 행을 주어진 E_ID와 일치하는 결과로 채우기 위해 질의되고 매번 2 개의 d_d_id가 반환됩니다.

귀하의 목표는 프로그래밍 방식으로 제공 한 양식을 만드는 것이 었습니다. 이를 수행하려면 데이터베이스를 네 번 쿼리해야합니다. 일단 이벤트를 위해 한 번, 접시에 한 번, 장비에 한 번, 이벤트에 관련된 직원 한 번.

SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM 
FROM event 
INNER JOIN customer ON EVENT.C_C_ID = CUSTOMER.C_ID 
INNER JOIN eventtype ON EVENT.ET_ET_ID = EVENTTYPE.ET_ID 
INNER JOIN venue ON EVENT.V_V_ID = VENUE.V_ID 
WHERE E_ID ='E000001'; 

SELECT D_DESC, D_AMT 
FROM EVENT_DISHES 
INNER JOIN DISHES ON DISHES.D_ID = EVENT_DISHES.D_D_ID 
WHERE E_E_ID ='E000001'; 

SELECT EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME 
FROM EVENT_EQUIPMENT 
INNER JOIN EQUIPMENT ON EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID 
INNER JOIN SUPPLIER ON SUPPLIER.SU_ID = EQUIPMENT.SU_SU_ID 
WHERE E_E_ID ='E000001'; 

SELECT ST_DESC, S_FNAME, S_LNAME 
FROM EVENT_STAFF 
INNER JOIN STAFF ON STAFF.S_ID = EVENT_STAFF.S_S_ID 
INNER JOIN STAFFTYPE ON STAFFTYPE.ST_ID = STAFF.ST_ST_ID 
WHERE E_E_ID ='E000001'; 

해당 입력란에 모든 입력란을 정확하게 일치 시키길 바랍니다. 필요한만큼 수정하십시오.

+0

이 접근법은 이벤트가 표시되기 전에 ** 모든 ** 구성 요소가 (암시 적) 내부 조인 (INNER JOINS)으로 인해 발생해야한다는 필요성을 피합니다. – RicmanX

+0

도움을 주신 대단히 감사합니다. –