對于表
t1:
C1 C2 C3
1 2 3
4 5 6
表t2:
C1 C2 C4
33 44 55
應該撰寫什么查詢來合并所有公共列,以便結果如下:
C1 C2
1 2
4 5
33 44
重要的是要注意,我不是在為兩個表尋找解決方案,而是在為資料庫中的每個表尋找解決方案。DB 是 SQLite
uj5u.com熱心網友回復:
SQLite 不支持動態 sql,因此您可以使用它自己的功能來做的最多的事情是構建一個 SQL 陳述句,您可以使用 Java 或 Python 等編程語言執行它。
這個查詢:
WITH tables AS (SELECT name FROM sqlite_master WHERE type = 'table')
SELECT pti.name col
FROM tables t CROSS JOIN pragma_table_info(t.name) pti
GROUP BY col
HAVING COUNT(*) = (SELECT COUNT(*) FROM tables);
回傳在資料庫的所有表中共有的所有列。
通過使用,GROUP_CONCAT()您可以將所有這些列作為逗號分隔的串列,您可以在SELECT陳述句中使用:
WITH tables AS (SELECT name FROM sqlite_master WHERE type = 'table')
SELECT GROUP_CONCAT(col) columns
FROM (
SELECT pti.name col
FROM tables t CROSS JOIN pragma_table_info(t.name) pti
GROUP BY col
HAVING COUNT(*) = (SELECT COUNT(*) FROM tables)
);
最后,連接關鍵字'SELECT'and'FROM'和每個表的名稱,并GROUP_CONCAT()再次使用 and 'UNION ALL'(or 'UNION') 作為分隔符構造 sql 陳述句:
WITH tables AS (SELECT name FROM sqlite_master WHERE type = 'table')
SELECT GROUP_CONCAT(sql, ' UNION ALL ') sql
FROM (
SELECT 'SELECT ' ||
(
SELECT GROUP_CONCAT(col) columns
FROM (
SELECT pti.name col
FROM tables t CROSS JOIN pragma_table_info(t.name) pti
GROUP BY col
HAVING COUNT(*) = (SELECT COUNT(*) FROM tables)
)
) || ' FROM ' || name AS sql
FROM tables
);
這將回傳一個字串,如:
SELECT col1,col2 FROM table1 UNION ALL SELECT col1,col2 FROM table2 UNION ALL SELECT col1,col2 FROM table3
你可以執行。
查看一個簡化的演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/340575.html
上一篇:java.lang.NoSuchFieldError:INSTANCE僅在Tomcat上運行時
下一篇:根據兩列的值添加或減去值
