2014-10-22 5 views
0

정말 간단한 쿼리 인 것 같지만 분명히 뭔가 빠져 있어야합니다. 이 시나리오가 꽤 일반적이라고 가정합니다.Oracle/SQL에서 기본 쿼리의 테이블과 조인을 수행하는 동안 인라인 뷰를 사용하여 상위 n 개를 가져 오는 방법은 무엇입니까?

제품을 저장하는 테이블과 트랜잭션을 저장하는 테이블이 있습니다. 거래 테이블에는 세일즈맨에 대한 정보가 있습니다. 이제 모든 제품을 나열하고이 제품을 마지막으로 판매 한 영업 사원의 ID를 포함하는 보고서를 작성해야합니다.

내가 같은 간단한 쿼리를 시도 :

선택 이드 PRODUCT_NAME가 에서 (선택 salesman_id는 (트랜스 에서 salesman_id 을 선택 여기서 PRODUCT_ID = a.id TRANS_DATE 내림차순 의해 순서) 여기서 ROWNUM = 1) salesman_id 제품에서

이 쿼리는 잘못된 식별자를 a.id에서 받았습니다.

그래서 그물을 검색 한 후, LATERAL 절을 추가하려고했습니다. 추천

가 선택 이드 PRODUCT_NAME가 는, 횡 제품에서 을 salesman_id 다음 (트랜스 에서 salesman_id 을 선택 ( 에서 salesman_id을 선택 여기서 TRANS_DATE 내림차순 의해 PRODUCT_ID = a.id 순서) ROWNUM = 1)

하지만이 쿼리는 불완전한 SQL 문을 제공합니다.

단일 쿼리에서이 작업을 수행하는 간단한 방법이 있습니까?

+0

이것은 요 u : http://sqlfiddle.com/을 사용하여 예제를 작성하십시오. 불완전한 SQL을 작성했다는 것을 감안할 때, 해결 될 때,'top 5 * from()'또는 무언가를 제한하기 위해 왜하지 않겠습니까? – Fallenreaper

답변

1
select id, product_name, salesman_id from 
(select p.id, p.product_name, t.salesman_id, row_number() over(partition by p.id order by t.trans_date desc) rw 
    from products p left join trans t on t.product_id = p.id 
) where rw = 1; 
  1. 테이블 제품을 가입하고 트랜스
  2. 일부 제품은 트랜잭션을하지 않을 수 있습니다. 당신은 모든 제품을 보여줄 필요가로서 당신은
+0

sql 바이올린 http://sqlfiddle.com/#!4/8af64/15/0 – sohail

0

당신은 단지 필요 (순서없이 각 제품에 대해 1부터 시작) LEFT는 각 제품에 대해 각 트랜잭션의 주문 번호 (ROW_NUMBER)를 계산하는

  • 사용 분석 기능을 가입 필요 하위 쿼리, 뭔가 더 같은 :

    선택 p.id, p.product_name, 제품 페이지에서 t.salesman_id, 트랜스 t 곳 t.product_id = p.product_id 및 t.trans_date = (에서 최대 (TRANS_DATE)를 선택 trans t_in where t_in.product_id = t.product_id)

  • +0

    완벽하게 작동하지만 rownum을 사용하려고합니다. 톰과 스택 오버플로에서 읽은 내용을 기반으로 효율적입니다. – sohail