Python PostgreSQL中的子查询返回多行

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列 我得到一个错误:使用下面的代码,一

表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子句,而且我也看不出该语句有什么问题。我试图将这两个值切换到等号的左侧和右侧,等等,但没有成功。有人能帮我吗

解决方案:
我使用以下代码解决了此问题:

    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

      我通过将SELECT和UPDATE语句拆分为单独的语句来解决这个问题。另外,在语句中:从column2=variable.的表中选择column1。。第2列应该位于表中,而不是来自另一个表。否则,它无法找到要选择或更新的正确记录。这些技巧是解决问题的关键。看看问题的答案。谢谢

      我通过将SELECT和UPDATE语句拆分为单独的语句来解决这个问题。另外,在语句中:从column2=variable.的表中选择column1。。第2列应该位于表中,而不是来自另一个表。否则,它无法找到要选择或更新的正确记录。这些技巧是解决问题的关键。看看问题的答案。谢谢

      您确定数据库中没有两条日期相同的记录吗?为了使它至少容易出错,您可以向子查询添加一个限制1…您确定数据库中没有两个日期相同的记录吗?为了使它至少容易出错,您可以在子查询中添加一个限制1…@mike:是的,它现在可以工作了!我正在使用print语句2,它正在打印数百万条记录,这意味着它现在可以工作了。但由于某些原因,它只是不将记录更新到表1中。那是怎么回事?谢谢很可能您的WHERE子句找不到任何要更新的结果。我想知道语句:update table SET column=(从table2中选择column2..)。。有没有意义。它应该怎么写?@mike:是的,现在可以用了!我正在使用print语句2,它正在打印数百万条记录,这意味着它现在可以工作了。但由于某些原因,它只是不将记录更新到表1中。那是怎么回事?谢谢很可能您的WHERE子句找不到任何要更新的结果。我想知道语句:update table SET column=(从table2中选择column2..)。。有没有意义。它应该怎么写?