创建SQLite视图作为与源表名称字段的联合

时间:2018-02-05 14:31:55

标签: sql sqlite

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';

(类似问题提示:12。)

我可以find the column names of a tablet

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中对其进行元编程。

0 个答案:

没有答案