SQLite数据库具有未定义数量的具有相同模式的表。需要一个视图,它是所有这些表的并集,并添加了一个设置为源表名称的字段。
请注意,表名是未知的,列名也是如此。可以假设的是,所有表都具有相同的模式(即相同的列)。
是否可以在SQLite3中执行此操作?
我可以根据先前的知识手动构建视图:
create view V(A,B,C) as select 'A' as Tbl, * from A union select 'B' as Tbl, * from B ...
我可以找到这些表(可选:只有以X
开头的表名):
SELECT name FROM sqlite_master where type='table' and name like 'X';
我可以find the column names of a table,t
:
pragma table_info(t)
我可以使用上述信息在 SQLite 之外构建查询,在本例中使用bash
,然后将其应用于数据库:
# build a select for each table
selects=()
for table in $(sqlite3 "$DB" "SELECT name FROM sqlite_master where type='table'")
do
selects+=("select '$table' as Tbl, * from $table")
done
# Column names for new view, first is source table name followed
# by the table's column names (of the last table, but all assumed to be the same)
columns=(Tbl $(sqlite3 "$DB" "pragma table_info($table)" | awk -F '|' '{print $2}'))
# Build union query
set -o noglob
query=''
for union in "${selects[@]::${#selects[@]}-1}"
do
query+="$union union all "
done
query+="${selects[-1]}"
sqlite3 "$DB" "create view AllTables($(IFS=,;echo "${columns[*]}")) as $query"
理想情况下,我更喜欢在SQLite3中执行此操作,而无需在shell中对其进行元编程。