我有幾個表至少 26 ......我試圖從所有表中選擇一列并將它們顯示為一個
我試過這個:
(SELECT col1,col2,col3,col4
FROM table1
ORDER BY col1 DESC LIMIT 1)
UNION
(SELECT col1,col2,col3,col4
FROM table2
ORDER BY col1 DESC LIMIT 1)
這有效,但我必須根據我擁有的表格數量進行多次復制和粘貼,這不是很有效。請幫助——我剛開始學習 mysql,我一直在努力解決這個問題。
uj5u.com熱心網友回復:
您可以通過在存盤程序中使用游標來實作,如下所示:
CREATE DEFINER=`homestead`@`%` PROCEDURE `union_tables`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tablename VARCHAR(100);
DECLARE tableschema VARCHAR(100);
DECLARE sql_union_tables TEXT;
DECLARE tables_cursor CURSOR FOR SELECT TABLE_NAME, TABLE_SCHEMA FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'DbInscripciones' AND TABLE_NAME LIKE 'TblFaltasA%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN tables_cursor;
SET sql_union_tables = '';
read_loop: LOOP
FETCH tables_cursor INTO tablename, tableschema;
IF done THEN
LEAVE read_loop;
END IF;
IF sql_union_tables = '' THEN
SET sql_union_tables = CONCAT('(SELECT numcontrol FROM ', tableschema, '.', tablename, ' LIMIT 1)');
ELSE
SET sql_union_tables = CONCAT(sql_union_tables, ' UNION ALL (SELECT numcontrol FROM ', tableschema, '.', tablename, ' LIMIT 1)');
END IF;
END LOOP;
CLOSE tables_cursor;
SET sql_union_tables = CONCAT(sql_union_tables, ';');
PREPARE stmt FROM sql_union_tables;
EXECUTE stmt;
SELECT sql_union_tables;
END
讓我們分部分解釋這一點。您可以通過查詢information_schema資料庫獲得所需表名的串列,tables_cursor游標將允許您遍歷該表串列。
在迭代部分,您使用從游標查詢中獲得的表構造一個查詢并將其保存在sql_union_tables.
完成查詢的構建后,您可以使用PREPAREandEXECUTE陳述句執行它,并回傳結果查詢(最后一行)。
此存盤程序假定您的表中有相同的列。如果每個表的列都不同,則必須實作一些邏輯來處理它。
在此之后,您可以像這樣呼叫存盤程序:
CALL union_tables
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332890.html
