2011-07-06 88 views
0

假設我有四個表格(A,B,C,D),empId是常見的。如何存儲中間數據並在SQL查詢之間共享?

運行一些複雜的查詢後,我得到符合條件的empIds列表。

現在我需要運行Select .... from ..... where empId IN LIST

我想在一些變量中存儲這個empIds的列表,以便我沒有每次運行復雜查詢以獲取empIds的列表。

無論如何要將empIds存儲在一些臨時空間?

這樣我就可以減少每次運行這個複雜的查詢。

+2

你正在使用什麼數據庫系統?數據庫品牌之間使用臨時表的語法不同。 – Guffa

+1

列表中包含多少'empIds'?你想多久查詢清單?你想保留這份名單多長時間?該列表是用戶共同的還是限於特定用戶?基礎表中的數據多久改變一次?當存儲列表變得陳舊時,你想要做什麼?你有沒有做過任何基準測試,以確認花在管理緩存上的能量會比你在需求上執行原始查詢時節省更多? – APC

+0

感謝您的反饋,下次請注意。 –

回答

1

你可以在內存中使用語法創建一個表:

Select field1,field2,...fieldN INTO #tmp FROM SourceTable 

現在你可以訪問的內容表#tmp。

+1

這隻有在他在同一會話中運行所有後續查詢時纔有效。 – JNK

+0

此語法是否適用於Oracle 11i? –

1

由於數據庫針對連接進行了優化,因此您應該將昂貴的empIds存儲在表或視圖中,然後加入到該表中。

  1. 創建表
  2. 插入IDS該表
  3. 加入到臨時表免費(或廉價)

由於MySQL是據稱「世界上最流行的開源數據庫」在這裏是從他們的文檔的語法:

步驟1
http://dev.mysql.com/doc/refman/5.1/en/create-table.html

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 
    (create_definition,...) 
    [table_options] 
    [partition_options] 

僅供說教使用實施例:

CREATE TABLE expensive_ids (id); 

步驟2
http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] 
    [INTO] tbl_name [(col_name,...)] 
    SELECT ... 
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 

實施例僅用於教學用途:

INSERT INTO expensive_ids (id) VALUES (1); 

步驟3
http://dev.mysql.com/doc/refman/5.1/en/select.html

SELECT 
    [ALL | DISTINCT | DISTINCTROW ] 
     [HIGH_PRIORITY] 
     [STRAIGHT_JOIN] 
     [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
     [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
    select_expr [, select_expr ...] 
    [FROM table_references 

例僅用於教學用途:

SELECT my_other_table.id, expensive_ids.id 
    FROM my_other_table 
     LEFT JOIN expensive_ids 
     ON expensive_ids.id = my_other_table.id; 
+0

我是oracle的oracle 11,empId我包含數據在數千和查詢將被非常頻繁地使用。表中的數據也會變得非常頻繁。我只需要將數據緩存在存儲過程的範圍內,不想永遠保留它。而empId列表將會是非常複雜的查詢。每次它可以在不同的查詢約束條件 –