2016-04-04 25 views
2

我想從兩個單獨的表中獲取一些組合的結果。 transaction_fact表約有360萬行,translation_table約有300000行。 現在我想要根據位置和該位置內的產品分組的所有交易的金額總和。但由於事實表只有位置ID和產品ID,我希望結果中的名稱,我正在使用子查詢。SQL子查詢去嘿012

我的查詢如下:

SELECT 
     (SELECT translation 
      FROM translation_table 
      WHERE dim_name LIKE 'location_dim' 
      AND lang_id LIKE 'es' 
      AND dim_id LIKE CAST(o.loc_id AS CHAR(50)) 
      AND field_name LIKE 'city') AS Location 
    , (SELECT product_name 
      FROM prod_dim 
      WHERE prod_id = o.prod_id) AS Product 
    , SUM(amount) 
    FROM transaction_fact o 
    GROUP 
     BY loc_id 
     , prod_id 
    ORDER 
     BY loc_id 
     , prod_id; 

但此查詢不返回任何東西,只是不斷處理。 我等了大約一個半小時,但仍然沒有結果。

請告訴我什麼可能會出錯。

+0

這可能是我見過的最奇怪的查詢。如果您願意,可以考慮遵循以下簡單的兩步操作步驟:1.如果您尚未這樣做,請提供適當的DDL(和/或sqlfiddle),以便我們可以更輕鬆地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

+0

您應該查看JOIN –

+0

表和列的模式在答案1中給出。期望的結果是按地點和產品分組的交易總額的總和......即在一個地點的產品的所有交易總金額的總和......結果表應具有以下列:地點| Product | Total_amount –

回答

0

連接表應該消除子查詢的需要並提高性能。如果沒有,您可能需要提供更多關於表格結構的細節,然後才能提供幫助。像這樣的東西應該讓你開始:

SELECT t.translation AS Location, p.product_name AS Product, SUM(o.amount) AS Total 
FROM transaction_fact o 
    INNER JOIN translation_table t ON CAST(o.loc_id AS char(50)) = t.dim_id 
    INNER JOIN prod_dim p ON p.prod_id = o.prod_id 
WHERE t.dim_name = 'location_dim' 
      AND t.lang_id = 'es' 
      AND t.field_name = 'city' 
GROUP BY t.translation, p.product_name 
ORDER BY o.loc_id, o.prod_id; 

注:我已經改變了喜歡=,因爲喜歡的是當你想匹配,包括通配符的模式。

用於與translation_table連接的CAST並不理想。如果你能避免這種情況,你會獲得更好的表現。

+1

LIKE在區分大小寫的排序規則中也扮演着重要的角色。 – Strawberry

+0

有趣的是,我不知道這一點。謝謝。 OP,如有必要,隨時可以改回LIKE。 –

+0

它會不會創建約3個lac * 360萬行的聯接來過濾?因爲我們加入的表格分別有那麼多行。 –