2013-08-22 2 views
0

Oracle SQL을 사용하고 있습니다. 나는 두 개의 테이블을 가지고있다. One에는 ItemID와 DatePurchased가 있고 다른 하나에는 ItemID, CustomerID가 있습니다. 여러 항목이있는 고객 만 볼 수 있도록 테이블에 가입하려고합니다. 내가 가진 경우 즉SQL 쿼리 - ID 가입, 그냥 중복

:

TABLE 1 
ItemID---DatePurchased 
    1   MAR15 
    2   JUN10 
    3   APR02 

TABLE 2 
ItemID---CustomerID 
    1   1 
    2   1 
    3   2 

을 나는이 원하는 것 반환 :

TABLE 3 
ItemID--DatePurchased--CustomerID 
    1   MAR15   1 
    2   JUN10   1 

(그는 단지 있기 때문에 고객이 밖으로 남아 하나의 항목 (ItemID = 3)).

SQL에서이 작업을 수행하는 방법에 대한 아이디어가 있으십니까?

+1

체크 아웃 SQL 집계를 (이 경우에'COUNT'),'GROUP BY'이 작동'HAVING' 절 – Matthew

답변

1
select ItemID, DatePurchased, CustomerID 
from 
(
    select 
     T1.ItemID, T1.DatePurchased, T2.CustomerID, 
     count(*) over (partition by T2.CustomerId) as ItemCnt 
    from TABLE2 T2 
     join TABLE1 T1 on T1.ItemID = T2.ItemID 
) dt 
where ItemCnt > 1 
+0

이것도 작동한다. 감사! 이렇게하면 카운트가 저장되므로 이전 제안보다 빨리 실행됩니까? 그것은 더 빠를 것 같지만 이것은 모두 나를위한 학습 곡선입니다. – user1895076

+0

테이블에 대한 액세스가 하나뿐이기 때문에 OLAP 함수를 선호합니다. 동일한 테이블의 세부 정보와 수집 된 데이터가 필요하거나 다른 행의 데이터에 액세스해야하는 경우 OLAP을 사용하여 수행 할 수 있습니다. 특히 테이블이 아닌 복잡한보기 인 경우 훨씬 빠르고 쉽게 작성할 수 있습니다. – dnoeth

1
select 
    T2.ItemID, T2.CustomerID, T1.DatePurchased 
from TABLE2 as T2 
    inner join TABLE1 as T1 on T1.ItemID = T2.ItemID 
where 
    T2.CustomerID in 
    ( 
     select TT.CustomerID 
     from TABLE2 as TT 
     group by TT.CustomerID 
     having count(*) > 1 
    ) 
+0

하지만,이 일을 더 최적화 방법은 무엇입니까? WHERE IN 문이 매번 전체 목록을 검색합니까? 내 설명은 내가 사용하고있는 테이블의 단순화 된 버전이었다. 실생활에서 각 레코드에는 약 10MM 레코드가 있으므로 쿼리를 사용하여 시스템을 꼼짝 못하게하려고합니다. 감사합니다. – user1895076

+0

나는 dnoeth가 더 빠를 것이라고 생각한다. 오라클이 파티션을 허락한다면 모를 것이다. 따라서 구식 스타일을 사용해야한다. –