Dans la table1, il y a une colonne nommée calendar_date, l'enregistrement est au format 10/8/2010, dans la table2 il y a une colonne nommée date, au format de 10/8. Dans la table2, il existe deux autres colonnes nommées daynoleap, dayleap, qui indique le numéro de date julien de l'année noleap ou de l'année bissextile. Maintenant, j'ai besoin d'ajouter une colonne de ces deux à table1, déterminée par l'année de la colonne calendar_date. Si c'est 2010, il est divisé par 4 et a un reste, donc j'ajoute la colonne daynoleap de table2 à la colonne julian_date de table1. Sinon, j'ajoute une colonne dayleap.Plus d'une ligne retournée par une sous-requête dans PostgreSQL
Je reçois une erreur: plus d'une ligne retournée par une sous-requête utilisée comme une expression, en utilisant les codes ci-dessous: (Je crois que l'erreur provient de l'instruction de requête pour le moment). Tous les codes sont dans un forloop, dans lequel j'ai eu un seul enregistrement de la variable de l'année (par exemple, 2010), monthDate (par exemple 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()
De toute évidence, il y a un problème avec les codes pour l'empêcher de mettre à jour un enregistrement unique. Mais puisque j'ai déjà une clause WHERE pour l'instruction de mise à jour, et je ne vois pas de problème avec l'instruction non plus. J'ai essayé de changer les deux valeurs à gauche et à droite du signe égal, etc., mais cela n'a pas fonctionné. Quelqu'un peut m'aider?
Solution:
Je résolu ce problème en utilisant les codes ci-dessous:
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
Etes-vous sûr qu'il n'y a pas deux enregistrements avec la même date dans votre base de données? Pour faire au moins erreur, vous pouvez ajouter une LIMIT 1 à la sous-requête ... – dcn