Vraag


Acties:
  • 0 Henk 'm!

  • sp_mike
  • Registratie: November 2016
  • Laatst online: 26-06 21:21
Ik ben geen sql guru maar dacht dat ik een aardig eind was met onderstaande query (in python).
Mij probleem is het volgende. Ik heb deze tabel (artPerBrand):

code:
1
2
3
4
|ID     | ArtNrShort   | ArtNrLong      | SupplierID 
--------------------------------------------------
|45     | mik25          | mike25_002  | 1
|326    | mik25          |              | 2


Ik check de table voor rijen met dezelfde ArtNrShort. Dan ga ik het record waar ArtNrLong leeg is updaten met de waarde uit het record waar ArtNrLong niet leeg is. Ik geef aan de functie waar deze update plaats vindt de variabele "varArtNrShort" mee. Dus ik moet een update doen van alléén dat specifieke ArtNrShort.

Mijn code is nu:

code:
1
2
3
4
5
6
7
varArtNrShort = 'mik25'

sql = "UPDATE artPerBrand a1 INNER JOIN artPerBrand a2 ON a1.ArtNrShort = a2.ArtNrShort SET a1.ArtNrLong = a2.ArtNrLong WHERE a2.ArtNrLong IS NOT NULL AND a1.ArtNrLong IS NULL AND a1.ArtNrShort = '%s' "

val = (varArtNrShort)
cur.execute(sql, val)
mydb.commit()


Ik gebruik nu '%s' maar ook als ik keihard 'mik25' in de query gebruik heb ik hetzelfde resultaat.
Ik krijg geen foutmelding in mijn code maar het record wordt niet ge-update.

Ik gebruik een mariaDB.

Als ik zoek op internet in verschillende fora en ik combineer eea dan zou mijn query moeten kloppen. Blijkbaar toch niet ;-) Heeft iemand enig idee?

Alle reacties


Acties:
  • +2 Henk 'm!

  • HenkEisDS
  • Registratie: Maart 2004
  • Laatst online: 15-09 07:59
Chatgpt al eens gevraagd?


Het lijkt erop dat het probleem in de SQL-query zit. Als je een variabele gebruikt in de query, moet je deze op de juiste manier formatteren. In plaats van '%s' te gebruiken, moet je '%s' vervangen door een '?' en de variabele doorgeven als een parameter aan de execute-methode. Probeer de volgende code:

kotlin
Copy code
varArtNrShort = 'mik25'
sql = "UPDATE artPerBrand a1 INNER JOIN artPerBrand a2 ON a1.ArtNrShort = a2.ArtNrShort SET a1.ArtNrLong = a2.ArtNrLong WHERE a2.ArtNrLong IS NOT NULL AND a1.ArtNrLong IS NULL AND a1.ArtNrShort = ?"
val = (varArtNrShort,)
cur.execute(sql, val)
mydb.commit()
Hier gebruiken we een vraagteken (?) als een placeholder voor de parameter en geven we de parameter door als een tuple aan de execute-methode. Dit zou moeten werken om het record te updaten zoals bedoeld.

Acties:
  • 0 Henk 'm!

  • SjigEd
  • Registratie: Mei 2000
  • Laatst online: 17:37
In je query zeg je:

a1.ArtNrLong IS NULL AND a1.ArtNrShort = '%s'

dus hij moet null zijn EN gelijk aan je variabele. Die conditie gaat nooit waar zijn.
Ik denk dat het a1.ArtNrLong IS NULL AND a2.ArtNrShort = '%s' moet zijn.
En a2.ArtNrLong IS NOT NULL kan er dan ook wel uit.

Acties:
  • 0 Henk 'm!

  • HenkEisDS
  • Registratie: Maart 2004
  • Laatst online: 15-09 07:59
Nee die twee vars zijn verschillend, short en long.

Acties:
  • 0 Henk 'm!

  • sp_mike
  • Registratie: November 2016
  • Laatst online: 26-06 21:21
Hoi Henk,

Dank voor je antwoord. Ik ga het, straks thuis, proberen. Wel alvast een vraag. Toen ik dit probeerde:

code:
1
sql = "UPDATE artPerBrand a1 INNER JOIN artPerBrand a2 ON a1.ArtNrShort = a2.ArtNrShort SET a1.ArtNrLong = a2.ArtNrLong WHERE a2.ArtNrLong IS NOT NULL AND a1.ArtNrLong IS NULL AND a1.ArtNrShort = 'mik25'"


werkte het ook niet. Is dat logisch?

Chatgpt had ik ook geprobeerd zo kwam ik, voor het grootste deel, op mijn (net niet werkende) oplossing.

[ Voor 12% gewijzigd door sp_mike op 28-03-2023 10:14 ]


Acties:
  • +1 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 14:56

Knutselsmurf

LED's make things better

Controleer ook eens of a1.ArtNrLong wel NULL is, en niet bijvoorbeeld een empty string.

In plaats van direct een update-query, kun je eens beginnen met een select-query in eender wleke Mysql-frontend. Dan krijg je inzicht in welke gegevens er bijgewerkt zouden worden. Op die manier is het eenvoudiger om je query te debuggen. Als deze select-query dan de logische resultaten oplevert, kun je die eenvoudig weer omzetten naar een update-query

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • sp_mike
  • Registratie: November 2016
  • Laatst online: 26-06 21:21
"Controleer ook eens of a1.ArtNrLong wel NULL is, en niet bijvoorbeeld een empty string"

Dat zou ook nog wel eens kunnen. Thx

Acties:
  • 0 Henk 'm!

  • sp_mike
  • Registratie: November 2016
  • Laatst online: 26-06 21:21
Uiteindelijk bleken beide suggesties de oplossing te zijn. Ik heb het nu werkend met deze query:

code:
1
2
3
  sql = "UPDATE artPerBrand a1 INNER JOIN artPerBrand a2 ON a1.ArtNrShort = a2.ArtNrShort SET a1.ArtNrLong = a2.ArtNrLong WHERE a2.ArtNrLong IS NOT NULL AND a1.ArtNrLong ='' AND a1.ArtNrShort = %(var)s"
  val = (varArtNrShort)
  cur.execute(sql, {'var': varArtNrShort})


Als placeholder ? of '?' gebruiken werkte ook niet en %s zoals ik eerst had ook niet

Bedankt voor jullie hulp
Pagina: 1