PostgreSQL中的子查询返回多行

2024-09-30 06:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

表1中有一列名为calendar_date,记录格式为10/8/2010,表2中有一列名为date,格式为10/8。 在表2中还有另外两列名为daynoleap,dayleap,它表示noleap年或闰年的儒略日期编号。现在,我需要将这两列中的一列添加到表1中,由列calendar_date的年份决定。如果是2010年,则除以4并有余数,因此我将表2的daynoleap列添加到表1的julian_date列中。否则我会添加dayleap列。在

我得到了一个错误:一个用作表达式的子查询返回了多行,使用以下代码:(我认为错误现在来自query语句)。所有代码都在一个forloop中,其中我得到了年份变量(例如2010年)、monthDate(例如10/8)的单个记录。在

      while int(year)%4 == 0:
            statement2="UPDATE table1 SET julian_date = (SELECT dayleap FROM table2 WHERE date = '%s') WHERE (SELECT date FROM table2) = '%s'"
            statement2=statement2 % (monthDate, monthDate)
            curs2 = conn.cursor()
            curs2.execute(statement2,)
            conn.commit()

显然,代码有问题,无法更新单个记录。但是因为我已经为update语句准备了一个WHERE子句,而且我也不认为该语句有问题。我试图将这两个值切换到等号的左边和右边,等等,但是没有成功。有人能帮我吗?在

解决方案:
我用下面的代码解决了这个问题:

^{pr2}$

Tags: 代码date格式错误记录语句whereselect
3条回答

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

这是一个非常基本的更新语句。应该有零子查询和相关查询:

UPDATE table1 
  SET julian_date = dayleap
FROM table2
WHERE date = %s 

附言:

  • 我不会用数据类型(日期)命名列。虽然它允许它咬你在微妙和阴险的方式。在
  • 如果数据来自不受信任的源,而不是直接将其丢弃,则希望您的转义数据。在
  • 对于一些简单的事情,比如找到闰年,这似乎需要做很多工作。PostgreSQL已经知道:select extract(day from (2003 || '-03-01')::date - '1 day'::interval) = 29在这里可以将2003参数化为任意年份

您试图将julian_date设置为子查询返回的值(返回多个结果),但是不能指定多个结果。子查询只应返回一个结果,以便您可以设置julian_date。在

将子查询更改为:

SELECT dayleap FROM table2 WHERE date = '%s' LIMIT 1

您也可以将LIMIT 1添加到第二个子查询中。在

相关问题 更多 >

    热门问题