2013-08-22 59 views
0

我正在使用Oracle SQL。我有兩張桌子。一個有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 

(客戶2被省略了,因爲他只有一個項目(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一個會更快,不知道Oracle是否允許通過這樣的分區來使用舊式的 –