假設我有四個表格(A,B,C,D),empId
是常見的。如何存儲中間數據並在SQL查詢之間共享?
運行一些複雜的查詢後,我得到符合條件的empIds
列表。
現在我需要運行Select .... from ..... where empId IN LIST
。
我想在一些變量中存儲這個empIds
的列表,以便我沒有每次運行復雜查詢以獲取empIds
的列表。
無論如何要將empIds
存儲在一些臨時空間?
這樣我就可以減少每次運行這個複雜的查詢。
假設我有四個表格(A,B,C,D),empId
是常見的。如何存儲中間數據並在SQL查詢之間共享?
運行一些複雜的查詢後,我得到符合條件的empIds
列表。
現在我需要運行Select .... from ..... where empId IN LIST
。
我想在一些變量中存儲這個empIds
的列表,以便我沒有每次運行復雜查詢以獲取empIds
的列表。
無論如何要將empIds
存儲在一些臨時空間?
這樣我就可以減少每次運行這個複雜的查詢。
你可以在內存中使用語法創建一個表:
Select field1,field2,...fieldN INTO #tmp FROM SourceTable
現在你可以訪問的內容表#tmp。
這隻有在他在同一會話中運行所有後續查詢時纔有效。 – JNK
此語法是否適用於Oracle 11i? –
由於數據庫針對連接進行了優化,因此您應該將昂貴的empIds
存儲在表或視圖中,然後加入到該表中。
由於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;
我是oracle的oracle 11,empId我包含數據在數千和查詢將被非常頻繁地使用。表中的數據也會變得非常頻繁。我只需要將數據緩存在存儲過程的範圍內,不想永遠保留它。而empId列表將會是非常複雜的查詢。每次它可以在不同的查詢約束條件 –
你正在使用什麼數據庫系統?數據庫品牌之間使用臨時表的語法不同。 – Guffa
列表中包含多少'empIds'?你想多久查詢清單?你想保留這份名單多長時間?該列表是用戶共同的還是限於特定用戶?基礎表中的數據多久改變一次?當存儲列表變得陳舊時,你想要做什麼?你有沒有做過任何基準測試,以確認花在管理緩存上的能量會比你在需求上執行原始查詢時節省更多? – APC
感謝您的反饋,下次請注意。 –