我正在尝试创建一个将多个表编译为一个表的表,这个新表将有一个列,该列存储每行来源的表的名称。
(我正在将来自不同时间窗口的多个时间序列结果编译到一个汇总表中,但时间序列标签必须作为新列包含在内)
我正在使用pyscopg2
通过python将查询传递给postgres,并且要存储为文本的表名是在Python中创建并从Python传递的。
我的查询在一个隔离的本地 postgres 数据库上运行,因此我不担心将表名作为参数传递。是的,我知道这是不好的形式,但现在我只需要让它工作。
我希望完成的伪代码:
INSERT INTO destination_table VALUES ('string of source table name', select * from source_table)
应该注意的是,目标表已使用正确的维度/数据类型创建以接受数据。{}
内的名称是我从 python 传递的参数。
我尝试过的实际代码:
WITH upd as (SELECT many, columns, here… FROM {table_to_compile} where dep_count >=4)
INSERT INTO destination_table VALUES ('{table_to_compile}',(SELECT * from upd))
上面的代码返回一个错误,"the sub selection query should only return one column"
.
我已经使用INSERT INTO
尝试了不同的组合,但我不会发布我测试过的每个查询,因为我希望我的目标已经清楚地描述。
您不能使用values(expression, subquery)
,但您可以像这样向选择中添加常量:
INSERT INTO destination_table
select 'string of source table name' as column_name, *
from source_table;
所以,你说'我正在尝试创建一个将多个表编译成一个表',这对我来说听起来像是一个联合查询。 插入到 SQL Server 中(只需选择一个示例;我认为您没有指定您正在处理哪个数据库)。 下面是执行插入的简单示例脚本。
import pyodbc
user='sa'
password='PC#1234'
database='climate'
port='1433'
TDS_Version='8.0'
server='192.168.1.103'
driver='FreeTDS'
con_string='UID=%s;PWD=%s;DATABASE=%s;PORT=%s;TDS=%s;SERVER=%s;driver=%s' % (user,password, database,port,TDS_Version,server,driver)
cnxn=pyodbc.connect(con_string)
cursor=cnxn.cursor()
cursor.execute("INSERT INTO mytable(name,address) VALUES (?,?)",('thavasi','mumbai'))
cnxn.commit()
要执行联合,只需将正确的 SQL 语法替换为cursor.execute
语句即可。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2