将INSERT INTO与提供的文本字符串和另一个表中的select *一起使用

时间:2019-06-20 14:06:53

标签: python-3.x postgresql psycopg2

我正在尝试创建一个将多个表编译为一个表的表,该新表将具有一列,用于存储每行的来源表的名称。

(我正在将来自不同时间窗口的多个时间序列结果汇总到一个汇总表中,但是必须将时间序列标签作为新列添加)

我正在使用pyscopg2通过python将查询传递给postgres,并且要存储为文本的表名是在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尝试了不同的组合,但是我希望我已经明确描述了我的目标,因此我不会发布每一个已经测试过的查询。

2 个答案:

答案 0 :(得分:2)

您不能使用values(expression, subquery),但是可以像这样将常量添加到选择中:

INSERT INTO destination_table
select 'string of source table name' as column_name, * 
from source_table;

答案 1 :(得分:0)

因此,您说“我正在尝试创建一个将多个表编译成一个表的表”,这听起来像是对我的联合查询。在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