Logo du forum
 

Forum TTH-News

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [SQL / PL-SQL / SGBD] » Requete Update avec Select * from sur la même table
Login Mot de passe

1 visiteurs sur ce topic (0 membre(s), 1 invité(s) )


Auteur
Sujet : Requete Update avec Select * from sur la même table
Ludyka
Membre hyperactif
Membre # 32446

 Avatar du membre
Lieu : Montpellier/Perpignan

Messages :
281 (0.08 par jour)




Message du 05-03-2009 @ 11:37   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   


voili j'essaie de faire ça et sa fonctionne pas une idée ?

Code :


UPDATE machine_280 as e
SET e.driver = '0'
WHERE e.ID = ( SELECT MAX(de.ID) FROM machine_280 as de WHERE de.numero='290' AND de.date_time<='2009-02-03 04:12:00' AND de.driver='2' AND de.curr<>'0' ) ;



Edit: je suis sous MySql.

[message édité le 05-03-2009 @ 11:39 Par Ludyka]
----------
- Fixe : I7 920 @2.9 Ghz , Noctua NH-U12P , Gigabyte EX58-UD5 , 6*1 Go 1600 Mhz Corsair XMS3 DHX, Msi HD4870 OC , Antec NeoPower Neo HE 550 , Zalman GS1000

- Haut de page -
chris lo
Tartineur TTH Officiel
Membre # 20006

 Avatar du membre
Lieu : Roazhon (Breizh)

Messages :
27325 (5.54 par jour)




Message du 05-03-2009 @ 11:51   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

je comprends pas les "as" :???:

pourquoi tu ne déclares pas direct "e" et "de" ?
----------
Notebook 1 Asus N55SF | 15,6" WSXGA | Core i5-2430M | 2x4Go PC10600 | HDD 750Go 7200t/m | GeForce GT555M 2Go | Win10 64bits
Notebook 2 Asus M51SN | 15,4" WXGA+ | Core 2 Duo T8100 | 3+1Go PC2-5300 | SSD 120Go | GeForce 9500M GS | Win10 32bits
Netbook Asus X205TA | 11,6" HD | Atom Z3735F | 2Go PC10600 | SSD eMMC 64Go | Intel HD Graphics | Win8.1 32bits
Console Sony PS4 Pro 1To Smartphone Sony Xperia Z3+ 5,2" FHD 32Go (NG 7.1)
- Haut de page -
Ludyka
Membre hyperactif
Membre # 32446

 Avatar du membre
Lieu : Montpellier/Perpignan

Messages :
281 (0.08 par jour)




Message du 05-03-2009 @ 11:55   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

une habitude :) .

Même sans les as ça ne fonctionne pas :( :

You can't specify target table 'e' for update in FROM clause
----------
- Fixe : I7 920 @2.9 Ghz , Noctua NH-U12P , Gigabyte EX58-UD5 , 6*1 Go 1600 Mhz Corsair XMS3 DHX, Msi HD4870 OC , Antec NeoPower Neo HE 550 , Zalman GS1000

- Haut de page -
B2000
Administrateur
Membre # 185

 Avatar du membre
Lieu : France/Poitiers/juste à côté...

Messages :
9757 (1.47 par jour)




Message du 05-03-2009 @ 12:22   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

ca provoque une erreur de ce type :
Code :

#1093 - You can't specify target table 'utilisateurs' for update in FROM clause


ce qui est normal pour mysql, comme indiqué dans la doc http://dev.mysql.com | 12.2.11. UPDATE Syntax :
Code :

Currently, you cannot update a table and select from the same table in a subquery.



si on décrit ta requete de facon litterale, on obtient ceci :
donner la valeur "0" au champ "driver" de la table "machine_280" quand le champ "ID" est egal au champ "ID" le plus grand de la table "machine_280" parmis ceux qui ont à la fois la valeur "290" pour le champ "numero", la date inferieure ou egal a '2009-02-03 04:12:00', la valeur "2" pour "driver" et "curr" different de "0"

attention que pour utiliser une requete comme celle la, il faut que le MAX() puisse retourner une seule valeur...a priori, le champ ID est surement la clé primaire de la table et est en auto increment donc ca ne devrait pas poser de probleme
par contre, il resulte que ca ne mettrait a jour qu'une seule ligne de ta table (un seul ID retourné dans la deuxieme partie de la requete, donc un seul ID dans la premiere partie)

si la requete formulée au depart correspond reellement a ton besoin, celle qui suit devrait pouvoir la remplacer :
Code :

UPDATE machine_280 SET driver = '0'
WHERE numero='290' AND date_time<='2009-02-03 04:12:00' AND driver='2' AND curr<>'0'
ORDER BY ID DESC
LIMIT 1



a tester sur une copie de ta base bien entendu...
----------
Intel i5 8600K | Noctua NH-U14S | Asus Prime Z370-P | Ballistix Sport LT 16Go DDR4-2666MHz | PNY GeForce GTX 1060 XLR8 OC 6 Go | SAMSUNG 840 Pro 256Go | Western Digital WD Blue 1To | Sony AD-7280S | Corsair STRAFE RGB | Roccat Kova | SteelSeries QcK | Corsair Gaming Void USB | iiyama ProLite E2472HDD

Ryzen 7 1800x | MSI X370 Gaming Pro Carbon | 2x 8Go DDR4 | MSI GeForce 1060GTX 3Go | SAMSUNG 960Pro NVME 512Go | SAMSUNG 840 Pro 512Go | LG 34um95 3440x1440 34" | 2x SAMSUNG SyncMaster SA450 1920x1200 24" | Clavier Lenovo Ultraslim sans fil | Souris Logitech MX Anywhere 2

Lenovo T430s : i5 3320m | 2x8Go | Toshiba 120Go | station Mini Dock serie 3

Nexus 6 64Go Android 7.1.1 | Garmin Forerunner 720XT | Nikon COOLPIX S9200 + Transcend SDHC 8GB | Canon PIXMA IP4850 | ADSL Freebox Révolution

Pour dialoguer en live, le chat TTH ou par mIRC sur irc://porsche.webchat.org:6667/tt-hardware

Rejoignez la team EBuyClub TTH !!!

Un jour j'ai mangé une pomme...
- Haut de page -
Ludyka
Membre hyperactif
Membre # 32446

 Avatar du membre
Lieu : Montpellier/Perpignan

Messages :
281 (0.08 par jour)




Message du 05-03-2009 @ 12:25   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Merci beaucoup B2000 :gaf:

je teste en début d'après-midi :)
----------
- Fixe : I7 920 @2.9 Ghz , Noctua NH-U12P , Gigabyte EX58-UD5 , 6*1 Go 1600 Mhz Corsair XMS3 DHX, Msi HD4870 OC , Antec NeoPower Neo HE 550 , Zalman GS1000

- Haut de page -
B2000
Administrateur
Membre # 185

 Avatar du membre
Lieu : France/Poitiers/juste à côté...

Messages :
9757 (1.47 par jour)




Message du 05-03-2009 @ 12:26   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

chris lo a écrit

je comprends pas les "as" :???:

pourquoi tu ne déclares pas direct "e" et "de" ?



AS sert a definir des alias (tu t'en doutais :D) ca peut :
- simplifier la requete
- permettre de lever des ambiguités dans la requete quand plusieurs champs issus de plusieurs sous-requetes ou de differentes tables ont les memes noms
----------
Intel i5 8600K | Noctua NH-U14S | Asus Prime Z370-P | Ballistix Sport LT 16Go DDR4-2666MHz | PNY GeForce GTX 1060 XLR8 OC 6 Go | SAMSUNG 840 Pro 256Go | Western Digital WD Blue 1To | Sony AD-7280S | Corsair STRAFE RGB | Roccat Kova | SteelSeries QcK | Corsair Gaming Void USB | iiyama ProLite E2472HDD

Ryzen 7 1800x | MSI X370 Gaming Pro Carbon | 2x 8Go DDR4 | MSI GeForce 1060GTX 3Go | SAMSUNG 960Pro NVME 512Go | SAMSUNG 840 Pro 512Go | LG 34um95 3440x1440 34" | 2x SAMSUNG SyncMaster SA450 1920x1200 24" | Clavier Lenovo Ultraslim sans fil | Souris Logitech MX Anywhere 2

Lenovo T430s : i5 3320m | 2x8Go | Toshiba 120Go | station Mini Dock serie 3

Nexus 6 64Go Android 7.1.1 | Garmin Forerunner 720XT | Nikon COOLPIX S9200 + Transcend SDHC 8GB | Canon PIXMA IP4850 | ADSL Freebox Révolution

Pour dialoguer en live, le chat TTH ou par mIRC sur irc://porsche.webchat.org:6667/tt-hardware

Rejoignez la team EBuyClub TTH !!!

Un jour j'ai mangé une pomme...
- Haut de page -
Ludyka
Membre hyperactif
Membre # 32446

 Avatar du membre
Lieu : Montpellier/Perpignan

Messages :
281 (0.08 par jour)




Message du 05-03-2009 @ 14:08   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Merci ça fonctionne impec :smilejap:
----------
- Fixe : I7 920 @2.9 Ghz , Noctua NH-U12P , Gigabyte EX58-UD5 , 6*1 Go 1600 Mhz Corsair XMS3 DHX, Msi HD4870 OC , Antec NeoPower Neo HE 550 , Zalman GS1000

- Haut de page -
B2000
Administrateur
Membre # 185

 Avatar du membre
Lieu : France/Poitiers/juste à côté...

Messages :
9757 (1.47 par jour)




Message du 05-03-2009 @ 15:12   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

la requete fonctionne mais fait-elle reellement ce que tu voulais faire ?
----------
Intel i5 8600K | Noctua NH-U14S | Asus Prime Z370-P | Ballistix Sport LT 16Go DDR4-2666MHz | PNY GeForce GTX 1060 XLR8 OC 6 Go | SAMSUNG 840 Pro 256Go | Western Digital WD Blue 1To | Sony AD-7280S | Corsair STRAFE RGB | Roccat Kova | SteelSeries QcK | Corsair Gaming Void USB | iiyama ProLite E2472HDD

Ryzen 7 1800x | MSI X370 Gaming Pro Carbon | 2x 8Go DDR4 | MSI GeForce 1060GTX 3Go | SAMSUNG 960Pro NVME 512Go | SAMSUNG 840 Pro 512Go | LG 34um95 3440x1440 34" | 2x SAMSUNG SyncMaster SA450 1920x1200 24" | Clavier Lenovo Ultraslim sans fil | Souris Logitech MX Anywhere 2

Lenovo T430s : i5 3320m | 2x8Go | Toshiba 120Go | station Mini Dock serie 3

Nexus 6 64Go Android 7.1.1 | Garmin Forerunner 720XT | Nikon COOLPIX S9200 + Transcend SDHC 8GB | Canon PIXMA IP4850 | ADSL Freebox Révolution

Pour dialoguer en live, le chat TTH ou par mIRC sur irc://porsche.webchat.org:6667/tt-hardware

Rejoignez la team EBuyClub TTH !!!

Un jour j'ai mangé une pomme...
- Haut de page -
Ludyka
Membre hyperactif
Membre # 32446

 Avatar du membre
Lieu : Montpellier/Perpignan

Messages :
281 (0.08 par jour)




Message du 05-03-2009 @ 15:19   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Oui, elle récupère bien la bonne ID a chaque fois.

Merci encore :p
----------
- Fixe : I7 920 @2.9 Ghz , Noctua NH-U12P , Gigabyte EX58-UD5 , 6*1 Go 1600 Mhz Corsair XMS3 DHX, Msi HD4870 OC , Antec NeoPower Neo HE 550 , Zalman GS1000

- Haut de page -
B2000
Administrateur
Membre # 185

 Avatar du membre
Lieu : France/Poitiers/juste à côté...

Messages :
9757 (1.47 par jour)




Message du 05-03-2009 @ 16:51   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

de rien
juste pour être précis, on remplace le MAX() par le ORDER BY ID DESC LIMIT 1 (tri décroissant sur le champ ID et limite à un seul résultat)
----------
Intel i5 8600K | Noctua NH-U14S | Asus Prime Z370-P | Ballistix Sport LT 16Go DDR4-2666MHz | PNY GeForce GTX 1060 XLR8 OC 6 Go | SAMSUNG 840 Pro 256Go | Western Digital WD Blue 1To | Sony AD-7280S | Corsair STRAFE RGB | Roccat Kova | SteelSeries QcK | Corsair Gaming Void USB | iiyama ProLite E2472HDD

Ryzen 7 1800x | MSI X370 Gaming Pro Carbon | 2x 8Go DDR4 | MSI GeForce 1060GTX 3Go | SAMSUNG 960Pro NVME 512Go | SAMSUNG 840 Pro 512Go | LG 34um95 3440x1440 34" | 2x SAMSUNG SyncMaster SA450 1920x1200 24" | Clavier Lenovo Ultraslim sans fil | Souris Logitech MX Anywhere 2

Lenovo T430s : i5 3320m | 2x8Go | Toshiba 120Go | station Mini Dock serie 3

Nexus 6 64Go Android 7.1.1 | Garmin Forerunner 720XT | Nikon COOLPIX S9200 + Transcend SDHC 8GB | Canon PIXMA IP4850 | ADSL Freebox Révolution

Pour dialoguer en live, le chat TTH ou par mIRC sur irc://porsche.webchat.org:6667/tt-hardware

Rejoignez la team EBuyClub TTH !!!

Un jour j'ai mangé une pomme...
- Haut de page -
Ludyka
Membre hyperactif
Membre # 32446

 Avatar du membre
Lieu : Montpellier/Perpignan

Messages :
281 (0.08 par jour)




Message du 06-03-2009 @ 10:37   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

B2000 a écrit

de rien
juste pour être précis, on remplace le MAX() par le ORDER BY ID DESC LIMIT 1 (tri décroissant sur le champ ID et limite à un seul résultat)



Pourquoi on utilise pas MAX(ID) ? ( on m'a appris comme sa en cours) Gain de temps ? Moins de charge pour le serveur ?
----------
- Fixe : I7 920 @2.9 Ghz , Noctua NH-U12P , Gigabyte EX58-UD5 , 6*1 Go 1600 Mhz Corsair XMS3 DHX, Msi HD4870 OC , Antec NeoPower Neo HE 550 , Zalman GS1000

- Haut de page -
Paddy
Vétéran
Membre # 8375

 Avatar du membre
Lieu : Sélestat

Messages :
8550 (1.51 par jour)


Score :

Message du 06-03-2009 @ 12:12   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Ludyka a écrit



Pourquoi on utilise pas MAX(ID) ? ( on m'a appris comme sa en cours) Gain de temps ? Moins de charge pour le serveur ?



Il me semble qu'on ne peut pas mettre de MAX dans la partie WHERE d'une expression et étant donné que tu ne peux faire de sous-requête SELECT pour ton UPDATE, c'est la seule autre solution ;)
Dans le cas d'un recherche bête et méchante de la plus grande valeur d'un champ, j'imagine que les 2 se valent ;)

[message édité le 06-03-2009 @ 12:13 Par Paddy]
----------
Masterdiablo /// PS3 - Wii U - iPhone 7s 256Go - iPhone 6s 128Go (pour Madame)
Core i5 7600K - Asus Prime Z270-A - 2*8Gb Corsair Vengeance - Asus GeForce DUAL-GTX1070-O8G - Samsung 850 Pro 256Go - WD Black 2To - Fractal Define R5 Black
- Haut de page -
B2000
Administrateur
Membre # 185

 Avatar du membre
Lieu : France/Poitiers/juste à côté...

Messages :
9757 (1.47 par jour)




Message du 06-03-2009 @ 12:31   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

c'est surtout que mysql, comme dit plus haut et repris par Paddy, ne supporte pas de SELECT et d'UPDATE sur une meme table dans la meme requete... c'est penible mais c'est comme ca
apres au niveau gain de temps, y a des chances que MAX() soit plus rapide car il me semble que LIMIT liste d'abord toutes les lignes possibles et ne renvoie que le nombre demandé ensuite
----------
Intel i5 8600K | Noctua NH-U14S | Asus Prime Z370-P | Ballistix Sport LT 16Go DDR4-2666MHz | PNY GeForce GTX 1060 XLR8 OC 6 Go | SAMSUNG 840 Pro 256Go | Western Digital WD Blue 1To | Sony AD-7280S | Corsair STRAFE RGB | Roccat Kova | SteelSeries QcK | Corsair Gaming Void USB | iiyama ProLite E2472HDD

Ryzen 7 1800x | MSI X370 Gaming Pro Carbon | 2x 8Go DDR4 | MSI GeForce 1060GTX 3Go | SAMSUNG 960Pro NVME 512Go | SAMSUNG 840 Pro 512Go | LG 34um95 3440x1440 34" | 2x SAMSUNG SyncMaster SA450 1920x1200 24" | Clavier Lenovo Ultraslim sans fil | Souris Logitech MX Anywhere 2

Lenovo T430s : i5 3320m | 2x8Go | Toshiba 120Go | station Mini Dock serie 3

Nexus 6 64Go Android 7.1.1 | Garmin Forerunner 720XT | Nikon COOLPIX S9200 + Transcend SDHC 8GB | Canon PIXMA IP4850 | ADSL Freebox Révolution

Pour dialoguer en live, le chat TTH ou par mIRC sur irc://porsche.webchat.org:6667/tt-hardware

Rejoignez la team EBuyClub TTH !!!

Un jour j'ai mangé une pomme...
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23230 (3.57 par jour)


Score :

Message du 06-03-2009 @ 15:04   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

il n'y a aucun moyen de creer un bloc transactionel(begin ... end) sous mysql ?
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
B2000
Administrateur
Membre # 185

 Avatar du membre
Lieu : France/Poitiers/juste à côté...

Messages :
9757 (1.47 par jour)




Message du 07-03-2009 @ 20:55   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

surement que si : http://dev.mysql.com/doc/refman/5.0/en/commit.html
----------
Intel i5 8600K | Noctua NH-U14S | Asus Prime Z370-P | Ballistix Sport LT 16Go DDR4-2666MHz | PNY GeForce GTX 1060 XLR8 OC 6 Go | SAMSUNG 840 Pro 256Go | Western Digital WD Blue 1To | Sony AD-7280S | Corsair STRAFE RGB | Roccat Kova | SteelSeries QcK | Corsair Gaming Void USB | iiyama ProLite E2472HDD

Ryzen 7 1800x | MSI X370 Gaming Pro Carbon | 2x 8Go DDR4 | MSI GeForce 1060GTX 3Go | SAMSUNG 960Pro NVME 512Go | SAMSUNG 840 Pro 512Go | LG 34um95 3440x1440 34" | 2x SAMSUNG SyncMaster SA450 1920x1200 24" | Clavier Lenovo Ultraslim sans fil | Souris Logitech MX Anywhere 2

Lenovo T430s : i5 3320m | 2x8Go | Toshiba 120Go | station Mini Dock serie 3

Nexus 6 64Go Android 7.1.1 | Garmin Forerunner 720XT | Nikon COOLPIX S9200 + Transcend SDHC 8GB | Canon PIXMA IP4850 | ADSL Freebox Révolution

Pour dialoguer en live, le chat TTH ou par mIRC sur irc://porsche.webchat.org:6667/tt-hardware

Rejoignez la team EBuyClub TTH !!!

Un jour j'ai mangé une pomme...
- Haut de page -


Aller dans le forum :  

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2010

Valid XHTML 1.0 Transitional

Page générée en 0.071 secondes