Python PostgreSQL中的子查询返回多行
表1中有一列名为calendar_date,记录格式为10/8/2010,表2中有一列名为date,格式为10/8。 在表2中,还有另外两列名为daynoleap,dayleap,表示noleap year或leap year的儒略日期编号。现在我需要将这两列中的一列添加到表1中,由列calendar_date的年份确定。如果是2010年,则除以4并有余数,因此我将表2的daynoleap列添加到表1的julian_date列中。否则,我会添加dayleap列 我得到一个错误:使用下面的代码,一个用作表达式的子查询返回了不止一行:(我相信这个错误现在来自查询语句)。所有的代码都在一个forloop中,在这个forloop中,我得到了年份(例如2010年)、月份(例如10/8)变量的单个记录 显然,代码有问题,无法更新单个记录。但是因为我已经为update语句使用了WHERE子句,而且我也看不出该语句有什么问题。我试图将这两个值切换到等号的左侧和右侧,等等,但没有成功。有人能帮我吗 解决方案:Python PostgreSQL中的子查询返回多行,python,postgresql,subquery,Python,Postgresql,Subquery,表1中有一列名为calendar_date,记录格式为10/8/2010,表2中有一列名为date,格式为10/8。 在表2中,还有另外两列名为daynoleap,dayleap,表示noleap year或leap year的儒略日期编号。现在我需要将这两列中的一列添加到表1中,由列calendar_date的年份确定。如果是2010年,则除以4并有余数,因此我将表2的daynoleap列添加到表1的julian_date列中。否则,我会添加dayleap列 我得到一个错误:使用下面的代码,一
我使用以下代码解决了此问题:
statement1='SELECT date FROM table1'
curs1.execute(statement1)
records1=curs1.fetchall()
for record1 in records1:
date = record1[0].split('/')
monthDate=date[0]+ '/'+date[1]
if int(year)%4 == 0: #for leap year
statement_tmp = "SELECT dayleap FROM table2 WHERE date = '%s'" % (monthDate) #the date column in table2 is in format of month/date.
curs1.execute(statement_tmp)
julianDate1 = curs1.fetchall()
julianDate = curs1.fetchall()[0][0]
statement = "UPDATE table1 SET juliandate = '%s' WHERE date = '%s'" % (julianDate, fullDate)
curs1.execute(statement)
conn.commit()
else: # for nonleap year
您试图将julian_date设置为子查询返回的内容(返回多个结果),但是您不能分配多个结果。子查询应该只返回一个结果,以便您可以设置julian_日期 将子查询更改为:
SELECT dayleap FROM table2 WHERE date = '%s' LIMIT 1
您可能还希望将限制1添加到第二个子查询。您试图将julian_日期设置为子查询返回的某个值(返回多个结果),但是您不能分配多个结果。子查询应该只返回一个结果,以便您可以设置julian_日期 将子查询更改为:
SELECT dayleap FROM table2 WHERE date = '%s' LIMIT 1
您可能还想在第二个子查询中添加限制1。这是一个非常基本的更新语句。子查询和相关查询应为零:
UPDATE table1
SET julian_date = dayleap
FROM table2
WHERE date = %s
附言:
- 我不会以数据类型(日期)命名列。虽然这是允许的,但它会以微妙和阴险的方式咬你
- 如果您希望转义的数据来自不受信任的源,而不仅仅是将其放入
- 对于一些简单的事情来说,比如找出闰年,这似乎是一个很大的工作。PostgreSQL已经知道:
select extract(day from(2003 | |'-03-01')::date-'1 day'::interval)=29
- 这是一个非常基本的更新语句。子查询和相关查询应为零:
UPDATE table1
SET julian_date = dayleap
FROM table2
WHERE date = %s
附言:
- 我不会以数据类型(日期)命名列。虽然这是允许的,但它会以微妙和阴险的方式咬你
- 如果您希望转义的数据来自不受信任的源,而不仅仅是将其放入
- 对于一些简单的事情来说,比如找出闰年,这似乎是一个很大的工作。PostgreSQL已经知道:
select extract(day from(2003 | |'-03-01')::date-'1 day'::interval)=29