2017-12-21 11 views
1

를 선택동적 열이 나는 세 개의 테이블이

T_ORDER_PLACEMENTS (ORDER_ID, CUSTOMER_ID, ORDER_DATE) 
T_ORDER_DETAILS (ORDER_ID, STOCK_ID) 
T_STOCK_DETAILS(STOCK_ID, STOCK_NAME, STOCK_PRICE) 
사람은 다음과 같은 출력을 생성하는 쿼리 작성 좀 도와 주시겠습니까

:

STOCK_ID, STOCK_NAME, STOCK_PRICE, ORDERED_STATUS 
1   stock1  5000   ordered 
2   stock2  10000  unordered 

주문 '과 ORDERED_STATUS 열 채우기를 '주식이 주문되어 있고 재고가 정렬되지 않은 경우'정렬되지 않은 '경우.

답변

1
SELECT 
    t_stock_details.*, 
    CASE WHEN order_check.stock_id IS NULL THEN 'unordered' ELSE 'ordered' END AS ordered_status 
FROM 
    t_stock_details 
LEFT JOIN 
(
    SELECT stock_id FROM t_order_details GROUP BY stock_id 
) 
    order_check 
     ON order_check.stock_id = t_stock_details.stock_id 

하위 쿼리는 어떤 순서로 연결된 stock_id인지 확인합니다. 또한 많은 수의 주문이 있더라도 stock_id 당 하나의 행만 반환되도록 GROUP BY을 사용합니다.

LEFT JOIN은 성공적으로 모든 항목에 연결되었는지 여부에 관계없이 t_stock_details의 모든 행을 반환합니다. 성공적인 합류가있을 경우, 우리는 명령이 있다는 것을 알고 있습니다. 또한 한 행에 최대 (위의 GROUP BY 덕분에 중복이 발생하지 않음)에 참여할 수 있습니다.

실패한 가입의 경우 은 order_check.stock_id이므로 CASE 문을 사용하여 반환 할 문자열을 확인하는 데 사용합니다.

+0

감사합니다. @MatBailie. 해결책이 작동했습니다 :) – Prashanth