2010-11-11 47 views
2

這是「雙反」表概念的延伸(飛一個查詢創建臨時表後直接丟棄)多行「雙反」表

我試圖加入多用另一個表dual表,以避免必須使用1個語句多次使用不同的參數運行相同的查詢。

我遇到的問題之一是聯合雙表非常慢,我不知道任何更有效的方式來完成以下。 (加入50雙100毫秒在一起時)

SELECT 
    b.id, 
    b.ref_unid, 
    a.date 
    FROM 
    (
    SELECT 
     'b8518a84-c501-11dd-b0b6-001d7dc91168' as unid, 
     '2010-01-05' as date 
    UNION 
    SELECT 
     'b853a1f2-c501-11dd-b0b6-001d7dc91168', 
     '2010-01-06' 
    UNION 
    SELECT 
     'b8557bd0-c501-11dd-b0b6-001d7dc91168', 
     '2010-01-07' 
    /* ... */ 
) as a 
    join other_table b 
     ON 
     b.ref_unid = a.unid 

是否有實現這個目標的另一種方式?

是否有類似刀片的任何語法爲價值聲明,將實現這一目標,如:

SELECT 
    unid, 
    id 
    FROM 
    (
     WITH (unid, date) USING VALUES 
     (
     ('b8518a84-c501-11dd-b0b6-001d7dc91168','2010-01-05'), 
     ('b853a1f2-c501-11dd-b0b6-001d7dc91168','2010-01-06'), 
     ('b8557bd0-c501-11dd-b0b6-001d7dc91168','2010-01-07'), 
     /* ... */ 
    ) 
    ) as a 
    join other_table b 
     ON 
     b.ref_unid = a.unid 

我正在尋找一個1語句的解決方案。多次訪問數據庫是不可能的。

回答

1

我沒有其他的約定,我知道在MySQL中可以用單個語句構造派生表。如果這涉及到一列,大約50個值,它可以轉換爲使用IN條款。

性能最佳的方法是將數據加載到一種或另一種形式的表中 - 在MySQL中,我建議使用MEMORY引擎進行臨時使用。在〜50個元組中,我不得不想知道爲什麼數據不在數據庫中...

+0

我編碼的API允許傳遞元組列表並返回這些元組中的每個元組的對象列表。 由於傳入的元組數量通常在10-50左右,我試圖避免調用一次查詢50次,只是改變了幾個參數。 我嘗試使用多個IN語句,但它不使用任何現有的索引,不同於上面的方法,除了雙表的聯合之外,它是非常快速的。 – 2010-11-12 09:36:48