2016-11-20 6 views
-1

예약 된 이벤트에 대해 은 이벤트 세부 사항, 선택한 고객 및 모든 장비의 세부 사항을 표시합니다. 장비가 필요합니다. 장비는 주택 장비 또는 고용 장비 중 하나 일 수 있습니다. 집과 고용 된 장비에는 데이터베이스의 두 가지 테이블이 있습니다. 이벤트 정보 및 고객 정보의 인스턴스에는 사내 장비 및 고용 된 장비가 있습니다.쿼리에서 반환 된 행이 없음

필자가 작성한 쿼리는 유니온 기술을 사용합니다. 아래 그림과 같이 테이블에 명확한 정보가 있더라도 쿼리는 "반환 된 행이 없습니다"를 반환합니다.

두 테이블의 다른 열의 이름을 바꾸기 위해 AS 함수를 사용했으며 고용 된 장비의 임대료와 같은 추가 열에 대해서는 null을 사용했습니다. 아무도 도와 줄 수 있습니까?

이 당신이 명확하게 테이블 E_ID = E000001에 대한 데이터를 가지고있는 이미지에서 볼 수있는 내 코드

COLUMN E_ID FORMAT A7 
COLUMN E_NAME FORMAT A35 
COLUMN E_STIME FORMAT A21 
COLUMN E_FTIME FORMAT A21 
COLUMN E_COST FORMAT 99999.99 
COLUMN ET_ET_ID FORMAT A5 
COLUMN ET_DESC FORMAT A10 
COLUMN V_V_ID FORMAT A5 
COLUMN V_NAME FORMAT A10 
COLUMN C_C_ID FORMAT A5 
COLUMN C_FNAME FORMAT A10 
COLUMN C_LNAME FORMAT A7 
COLUMN C_ORG FORMAT A20 
COLUMN C_CNUM FORMAT 9999999 
COLUMN EQ_ID FORMAT A5 
COLUMN EQ_DESC FORMAT A30 
COLUMN EQ_TYPE FORMAT A15 
COLUMN EQ_AMT FORMAT A3 
COLUMN RENT_FEE FORMAT 9999.99 
COLUMN SU_NAME FORMAT A35 
BREAK ON E_ID ON E_NAME ON C_C_ID ON C_FNAME ON C_LNAME ON C_ORG ON C_CNUM ON E_STIME ON E_FTIME ON E_COST ON ET_ET_ID ON ET_DESC ON V_V_ID ON V_NAME 
SELECT E_ID, E_NAME, EVENT.C_C_ID ,C_FNAME, C_LNAME, C_ORG, C_CNUM, E_STIME, E_FTIME, E_COST, EVENT.ET_ET_ID, EVENTTYPE.ET_DESC, EVENT.V_V_ID, VENUE.V_NAME, INEQUIPMENT.IE_ID AS EQ_ID, INEQUIPMENT.IE_DESC AS EQ_DESC, INEQUIPMENT.IE_TYPE AS EQ_TYPE, EVENT_INEQUIPMENT.IE_AMT AS EQ_AMT, NULL AS RENT_FEE, NULL AS SU_NAME 
FROM CUSTOMER, EVENT, EVENT_INEQUIPMENT, INEQUIPMENT, VENUE, EVENTTYPE 
WHERE EVENT.E_ID = 'E000001' 
AND EVENT.V_V_ID = VENUE.V_ID 
AND EVENT.ET_ET_ID = EVENTTYPE.ET_ID 
AND EVENT.C_C_ID = CUSTOMER.C_ID 
AND EVENT.E_ID = EVENT_INEQUIPMENT.IE_IE_ID 
AND EVENT_INEQUIPMENT.IE_IE_ID = INEQUIPMENT.IE_ID 
UNION ALL 
SELECT E_ID, E_NAME, EVENT.C_C_ID ,C_FNAME, C_LNAME, C_ORG, C_CNUM, E_STIME, E_FTIME, E_COST, EVENT.ET_ET_ID, EVENTTYPE.ET_DESC, EVENT.V_V_ID, VENUE.V_NAME, EXEQUIPMENT.XE_ID AS EQ_ID, EXEQUIPMENT.XE_DESC AS EQ_DESC, EXEQUIPMENT.XE_TYPE AS EQ_TYPE, EVENT_EXEQUIPMENT.XE_AMT AS EQ_AMT, EXEQUIPMENT.R_FEE AS RENT_FEE, SUPPLIER.SU_NAME AS SU_NAME 
FROM CUSTOMER, EVENT, EVENT_EXEQUIPMENT, EXEQUIPMENT, SUPPLIER, VENUE, EVENTTYPE 
WHERE EVENT.E_ID = 'E000001' 
AND EVENT.V_V_ID = VENUE.V_ID 
AND EVENT.ET_ET_ID = EVENTTYPE.ET_ID 
AND EVENT.C_C_ID = CUSTOMER.C_ID 
AND EVENT.E_ID = EVENT_EXEQUIPMENT.XE_XE_ID 
AND EVENT_EXEQUIPMENT.XE_XE_ID = EXEQUIPMENT.XE_ID 
AND EXEQUIPMENT.SU_SU_ID = SUPPLIER.SU_ID; 

입니다

enter image description here

enter image description here

답변

1

당신은하고 있어요 일련의 내부 조인. 즉, 조인되는 각 테이블에 대해 조인 조건에 따라 두 테이블에 나타나는 행만 요청할 수 있습니다. 따라서 메인 쿼리에서 반환 된 행이 없으면 테이블의 어딘가에 특정 e_id에 대한 조인 조건과 일치하지 않는 데이터가있는 것입니다.

시작에 대한

, 내가 지금처럼 ANSI JOIN 구문을 사용하여 쿼리를 다시 작성합니다 :

SELECT e_id, 
     e_name, 
     event.c_c_id, 
     c_fname, 
     c_lname, 
     c_org, 
     c_cnum, 
     e_stime, 
     e_ftime, 
     e_cost, 
     event.et_et_id, 
     eventtype.et_desc, 
     event.v_v_id, 
     venue.v_name, 
     inequipment.ie_id  AS eq_id, 
     inequipment.ie_desc  AS eq_desc, 
     inequipment.ie_type  AS eq_type, 
     event_inequipment.ie_amt AS eq_amt, 
     NULL      AS rent_fee, 
     NULL      AS su_name 
FROM event 
     INNER JOIN customer ON event.c_c_id = customer.c_id 
     INNER JOIN event_inequipment ON event.e_id = event_inequipment.ie_ie_id 
     INNER JOIN inequipment ON event_inequipment.ie_ie_id = inequipment.ie_id 
     INNER JOIN venue ON event.v_v_id = venue.v_id 
     INNER JOIN eventtype ON event.et_et_id = eventtype.et_id 
WHERE event.e_id = 'E000001' 
UNION ALL 
SELECT e_id, 
     e_name, 
     event.c_c_id, 
     c_fname, 
     c_lname, 
     c_org, 
     c_cnum, 
     e_stime, 
     e_ftime, 
     e_cost, 
     event.et_et_id, 
     eventtype.et_desc, 
     event.v_v_id, 
     venue.v_name, 
     exequipment.xe_id  AS eq_id, 
     exequipment.xe_desc  AS eq_desc, 
     exequipment.xe_type  AS eq_type, 
     event_exequipment.xe_amt AS eq_amt, 
     exequipment.r_fee  AS rent_fee, 
     supplier.su_name   AS su_name 
FROM event 
     INNER JOIN customer ON event.c_c_id = customer.c_id 
     INNER JOIN event_exequipment ON event.e_id = event_exequipment.xe_xe_id 
     INNER JOIN exequipment ON event_exequipment.xe_xe_id = exequipment.xe_id 
     INNER JOIN supplier ON exequipment.su_su_id = supplier.su_id; 
     INNER JOIN venue ON event.v_v_id = venue.v_id 
     INNER JOIN eventtype ON event.et_et_id = eventtype.et_id 
WHERE event.e_id = 'E000001'; 

당신은 당신이 쉽게 중 하나를 변환 할 수 있음을 완료하면 것은 외부 조인하거나 남아있을 조인 그것들을 모두 주석 처리하여 어떤 조인이 어떤 행을 리턴하지 않는지 진단 할 수있게하십시오.

이와 같은 쿼리를 사용하면 기본 테이블로 시작한 다음 문제가있는 곳을 찾을 때까지 하나씩 조인을 추가하는 것이 좋습니다.