Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/02/2011, 17h23   #1
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
Par défaut La requête du jour (siècle)

Bonjour à tous,

Je risque de passer pour une jambe de bois, mais là, j'ai fait la découverte du siècle

Tout ça pour dire que j'en ai appris une bonne...

Mon problème était que je devais supprimer des références employé dans de multiples tables. Malheureusement pour moi, en fait, heureusement, le delete cascade ne fonctionnait pas. En plus, le modèle de données est tellement complexe, ou pourri, c'est selon, qu'il m'était impossible de faire un alter table (...) on delete cascade. Il a donc fallu se la faire à l'ancienne et supprimer tous les enfants avant du supprimer les parents

Voilà la perle que j'ai trouvé, en fouillant sur le net, bien évidemment.
Le problème énoncé (simplifié) : Je cherche à supprimer tous les enfants des parents qui ne sont plus employé.

Code :
1
2
3
4
 
DELETE FROM Enfant
FROM Enfant e INNER JOIN Employe em ON e.idEmp = eAussi.id
WHERE eAussi.isEmploye = 0
BIM !!!

Ça faisait longtemps que j'avais pas été excité comme un jouvenceau
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h37   #2
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
reBIM!!!
Code :
1
2
3
DELETE e
FROM Enfant e INNER JOIN Employe em ON e.idEmp = eAussi.id
WHERE eAussi.isEmploye = 0
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h20   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Et sinon, vous avez une question ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2011, 19h01   #4
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
Citation:
Envoyé par Waldar Voir le message
Et sinon, vous avez une question ?
Pour l'instant pas. Mais comme il m'a été difficile de trouver cette information je la partage, je me dis qu'elle pourrait être utile à quelqu'un d'autre. Mais sans doute as-tu raison, j'aurai dû le mettre dans la FAQ
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 23h43   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Il est assez navrant de constater que cette requête simplissime soit supposé être le miracle du jour !
Preuve que les développeurs régressent à un point que je n'aurais jamais imaginé il y a dix ans....

Bref, messieurs, commencer par apprendre le langage SQL avec un vrai cours, en vous aidant d'une BON site web et d'un BON bouquin et non en lisant tout un tas de blog ou de livres à la con, comme SQL Tête la première !

On est en pleine régression...

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/02/2011, 11h28   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par LhIaScZkTer Voir le message
Bonjour à tous,

Je risque de passer pour une jambe de bois, mais là, j'ai fait la découverte du siècle
Pour être tout à fait honnête avec toi, la jointure est une découverte du siècle précédent...

__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 17h52   #7
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
ALERTE au TROLL !!!!!
Citation:
Envoyé par SQLpro Voir le message
Il est assez navrant de constater que cette requête simplissime soit supposé être le miracle du jour !
Preuve que les développeurs régressent à un point que je n'aurais jamais imaginé il y a dix ans....

Bref, messieurs, commencer par apprendre le langage SQL avec un vrai cours, en vous aidant d'une BON site web et d'un BON bouquin et non en lisant tout un tas de blog ou de livres à la con, comme SQL Tête la première !

On est en pleine régression...

A +
Je suis désolé mais je ne peux pas laisser passer un tel message. Il est clairement honteux de la part d'un enseignant du CNAM. Je suis auditeur au CNAM...

Ton message je le prends comme une attaque partiellement personnel. On va déjà remettre le contexte en place. Voilà les technologies que je pratique dans le cadre de mon travail html, css, javascript(avec du ajax), xml (schema et DTD), php, java, c#, vb.net , asp.net, SQL et dernièrement dev mobile. Malheureusement pour moi je fais de la maintenance logiciel (que de la correction de bugs... et mise aux normes w3c pour le web) donc j'ai pas de gros projet où je peux me perfectionner. Maintenir à jour toutes ces connaissances demande trop temps, temps que je n'ai pas puisque en plus j'étudie en cours du soir... En gros, je fais tout mais ne maitrise rien... la faute à qui ? A moi ? Je ne t'ai pas dit, mais j'ai un peu moins de 2 ans d'expérience et durant ces 2 ans je n'ai eu aucun teaching (je suis le seul développeur dans la boite ainsi que dans mon expérience passée) et personne pour m'inculquer les bonnes pratiques, d'ailleurs c'était plutôt le contraire, on me désapprenait. La faute à qui ? A moi, toujours ? Tu es informaticien et tu connais la réalité du marché. Quand tu trouves un boulot en tant que junior tu dois être le king de la planète et tout connaitre et être à 100% opérationnel... Le partage des connaissances se perd dans notre milieu. La question que je te pose est la suivante : Est-ce qu'il y a 10 ans un développeur devait pratiquer autant de technos en même temps ?

Pour ta deuxième allégation. Je suis auditeur au CNAM et détenteur d'un CP TDAI, je suis à une UE du CP Webmestre et à 20 crédits de la licence. Je suis certifier Java et j'aimerais me certifier .NET et PHP et Oracle. Tout ça pour monter en compétence. Les profs que j'ai eu en base de données, il y a eu Daniel Beauchêne qui enseigne aussi à l'IUP d'annecy, excellent prof. Puis Christophe Marty vraiment excellent prof et un support de cours impeccable et enfin Joëlle DELACROIX-GOUIN excellent prof aussi, mais le cours ne parlait pas que des BD, puisque ce n'était pas le sujet principal du cours.

Le problème de ces cours, c'est qu'ils sont très porté sur la modélisation de BD et les requêtes de type DML mais en SELECT. Il y a beaucoup d'exercices de ce type (select) et beaucoup moins pour tout ce qui touche au DDL et update et delete. D'ailleurs à mon boulot je fais plus de requête de type SELECT que de DELETE ou UPDATE qui elles sont définies au début et ensuite on y touche que très rarement. Ce qui explique que je sois moins à mon aise avec ce type de requête. Tu peux te targuer d'être un spécialiste en base de données mais je suis sûr que le 70% de ton temps, au minimum, tu ne fais que ça, avec en plus une dizaine d'années d'expérience. Donc tu n'as aucun mérite. As-tu oublié que toi aussi tu es passé par-là ? Il faut apprendre à modérer ton égo ! Je serai très heureux que tu m'envoies ton cours pour que je puisse lire son contenu et te saquer s'il manque quelque chose...

A propos des bons sites web et bouquins dont tu parles. J'ai en permanence un onglet d'ouvert sur sql et le 99% de mon temps je trouve ce que je recherche, c'est souvent pour me rafraichir la mémoire sur tel ou tel point. Mais j'en conclu que c'est un site à la con puisque l'information que je cherchais n'y était pas ?... Delete avec sous requête, merci de rajouter un exemple 17.2 avec le bout de code que j'ai mis car tu n'en traites pas. Et merci aussi de me remercier pour t'avoir montré une lacune dans tes exemples. Ton exemple supprime le/les tuple/s satisfaisant à la sous-requête qui ne renvoie qu'un résultat, alors que moi je cherchais à supprimer le/les tuple/s satisfaisant à la sous-requête qui renvoie plusieurs résultats. D'ailleurs avant j'avais testé ta requête et j'avais eu le message suivant :
Citation:
Server: Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
C'est vrai, j'aurais pu utiliser la sous requête avec un IN dans mon cas pour parlier à cette erreur. Cependant, laquelle des deux offre un meilleur temps de traitement ? Tiens, voilà où tu pourrais te rendre utile, répondre à cette question, car si ça se trouve tu n'en parles pas non plus dans ton billet sur l'optimisation avec ce type de requête ? Oui... je l'ai lu aussi, il est très intéressant, mais des fois certains exemples manquent de clarté et si mes souvenirs sont bons il n'y a que du DML.
Les uniques livres que je possède traitant des bases de données :
Conception et architecture des bases de données,
Bases de données écrit par Gardarin,
et et et... SQL 1er édition par Frédéric Brouard
Est-ce aussi des livres à la con ? Alors oui, c'est vrai, je ne les ai pas lu en entier, je m'en sers comme référence lorsque je recherche un élément en particulier. Et malheureusement, encore une fois, comme je ne fais pas du SQL toute la journée, j'ai tendance à oublier. C'est très volontiers que j'accepte une place dans ta société si tu me coatch.

Il est claire que pour les mammouths des bases de données dans ton genre cette syntaxe t'est familière, mais moi, je ne l'avais jamais vue et c'est pour ça que je l'ai posté, pour un partage de connaissance, sûrement pas à la hauteur du tien, mais un partage tout de même... Peut-être même que dans ton livre elle n'y est pas, je vais vérifier. Tu peux être sûr que t'auras droit à un commentaire à la hauteur du tien, sois-en sûr !

Ça serait pas mal de t'excuser aussi, d'éviter une poussée fulgurante d'égo de pré-grincheux-blasé-pédant et de m'envoyer un pdf de ton dernier livre car j'ai plus trop envie de l'acheter maintenant
J'espère que tu ne traites pas comme ça tes élèves, parce que de pas savoir ou de plus savoir c'est pas un crime, surtout quand on cherche à apprendre

A+
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 18h07   #8
Membre chevronné
 
Avatar de Oishiiii
 
Administrateur de base de données
Inscription : août 2009
Messages : 404
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : août 2009
Messages : 404
Points : 643
Points : 643
Citation:
Envoyé par LhIaScZkTer Voir le message
reBIM!!!
Code :
1
2
3
DELETE e
FROM Enfant e INNER JOIN Employe em ON e.idEmp = eAussi.id
WHERE eAussi.isEmploye = 0
Cette syntaxe ne se trouve pas dans les écrits d'SQLPro puisqu'ils concernent la syntaxe de la norme SQL, hors cette requête est une pure création de chez MySQL il me semble.

Elle permet de contourner l'impossibilité de réaliser certaines sous-requêtes dans les opérations DML.

Doc MySQL :
Citation:
Currently, you cannot delete from a table and select from the same table in a subquery.
Voir par exemple:
Update avec sous requête MySQL
Oishiiii est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/02/2011, 18h07   #9
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par LhIaScZkTer Voir le message
ALERTE au TROLL !!!!!

Je suis désolé mais je ne peux pas laisser passer un tel message. Il est clairement honteux de la part d'un enseignant du CNAM. Je suis auditeur au CNAM...
Pas la peine de monter sur tes grands chevaux comme ça. Les vieux schnocks comme SQLpro ou moi aimons bien dire que les jeunes sont mal éduqués et ne connaissent rien, ça n'a rien de très nouveau...

Sur le fond, SQLpro a raison de dire que ça n'est pas la découverte du siècle ; plus largement, ça me semble normal qu'un enseignant encourage les étudiants à ne pas se satisfaire de trucs de base et à creuser plus loin.

Enfin, la syntaxe que tu as citée est propre à MySQL, d'où le fait que tu ne l'ai pas trouvé sur le site ou dans les bouquins de SQLpro, qui traitent du SQL standard.

Citation:
J'espère que tu ne traites pas comme ça tes élèves, parce que de pas savoir ou de plus savoir c'est pas un crime, surtout quand on cherche à apprendre
A+
je suis sûr qu'il est pire !

Stimuler les étudiants n'est pas un crime non plus
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/02/2011, 18h34   #10
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
Citation:
Envoyé par Antoun Voir le message
Pas la peine de monter sur tes grands chevaux comme ça. Les vieux schnocks comme SQLpro ou moi aimons bien dire que les jeunes sont mal éduqués et ne connaissent rien, ça n'a rien de très nouveau...

(...)

Enfin, la syntaxe que tu as citée est propre à MySQL, d'où le fait que tu ne l'ai pas trouvé sur le site ou dans les bouquins de SQLpro, qui traitent du SQL standard.
Je ne monte pas sur mes grands chevaux, j'expose les faits. Et le fait est qu'il a eu une remarque très réductrice et mal placée, et ça au lieu d'avoir une intervention constructive et dire que ce n'était pas dans le standard. Comme tu aimes à le dire, les vieux schnocks dans votre genre, que vous disiez que les jeunes sont mal éduqués c'est votre problème, mais au moins apportez votre lumière...

Attends, je vais me pousser de 22 ans pour être ton aîné... Mon petit, cette requête a été pondue sur SQL Server. Merci de revoir tes non-standards... Ha ces jeunes d'aujourd'hui ils sont mal éduqués
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 18h36   #11
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
Merci pour tes liens Oishiiii, je vais regarder de plus près.
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 18h51   #12
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par LhIaScZkTer Voir le message
Je ne monte pas sur mes grands chevaux, j'expose les faits. Et le fait est qu'il a eu une remarque très réductrice et mal placée,
qu'est-ce qu'il a donc dit de si terrible ?
Citation:
Envoyé par LhIaScZkTer Voir le message
et ça au lieu d'avoir une intervention constructive et dire que ce n'était pas dans le standard. Comme tu aimes à le dire, les vieux schnocks dans votre genre, que vous disiez que les jeunes sont mal éduqués c'est votre problème, mais au moins apportez votre lumière...
Bah, si tu avais posé la question, on t'aurait répondu avec plaisir, mais là tu est juste venu tendre la verge pour te faire battre...
Citation:
Envoyé par LhIaScZkTer Voir le message
Attends, je vais me pousser de 22 ans pour être ton aîné... Mon petit, cette requête a été pondue sur SQL Server. Merci de revoir tes non-standards... Ha ces jeunes d'aujourd'hui ils sont mal éduqués
Je n'aurais pas cru que SQL Server accepte ça, mais bon, ça ne veut pas non plus dire que c'est du SQL normalisé. Mais là, je laisse SQLpro trancher, vu que c'est le seul à utiliser le SQL normalisé .

Ceci dit, oui, c'est naturel de faire une jointure ou une sous-requête IN dans ces cas-là, ou du moins ça devrait l'être. Il n'y a aucune honte à ne pas connaître ça quand on est en train d'apprendre, mais venir claironner que tu as découvert l'eau tiède et que c'est la révolution n'est quand même pas très glorieux
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 19h47   #13
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
Hello tout le monde!

Ben dis donc, moi qui voulait me mettre à SQL, (jamais vu, et autodidacte) vous me faites peur
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 20h01   #14
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,

Je suis d'accord avec LhIaScZkTer que la remarque de SQL pro était injurieuse, comme souvent d'ailleurs.
Je passe mon temps sur son site, je respecte ses connaissances, mais il ne se prend pas "pour une queue de figue" et il nous prend souvent pour de la m.. en nous insultant.
Ce qui m'a toujours étonné est qu'il soit modérateur, ces remarques ne sont jamais modérées et je suis quasi sure qu'il en est fier. Se faire insulter, ou traiter d'ignare quand on ne connait pas quelque chose est blessant et ne pousse pas à persévérer.

En revanche techniquement je dis chapeau, je m'incline, je ne lui arrive pas à la cheville pour le SQL.
Cordialement
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/02/2011, 20h38   #15
Membre confirmé
 
Avatar de LhIaScZkTer
 
Inscription : mai 2004
Messages : 536
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 536
Points : 217
Points : 217
Salut zouzoukha, j'espère que ça t'en empêchera pas, car c'est vraiment sympas les bases de données. En plus les tutos de SQLpro sont vraiment bien, mais attention à ne poser des questions/remarques débiles sinon , comme j'en ai fait les frais

Antoun, pour en conclure avec cette discussion qui ne fait pas avancer le smilblick, quoique à grand coup de flagélation j'ai toute de même appris que la requête n'était pas standard. Je reconnais que le titre du thread était mal choisi, mais j'étais juste content d'avoir trouvé une solution à un problème très urgent. En fait, j'étais content d'avoir trouvé quelqu'un qui l'avait trouvé avant moi... Ce qu'il a dit de terrible ? C'est que c'était simplement hors propos. Qu'il fasse ce constat ok, il aurait même pu émettre toutes les critiques qu'il voulait à condition de prendre la peine de dire que ce que j'avais trouvé (en fouillant le web) n'était pas standard, donc que c'était une fausse bonne solution. Pour ta deuxième remarque je te laisse lire la réponse que j'ai donné à waldar. Mais grâce aux commentaires qui on été fait, je me rends compte que cette requête n'a pas sa place dans la FAQ, ou si elle y est insérée, de mettre un warning disant que la requête n'est pas standard.

Vu que ça fonctionne avec SQL server et MySQL (j'ai pas testé), il serait intéressant de voir ce que ça donne sous Postgres, oracle et autres... Je l'aurais volontiers fait ce soir, mais demain j'ai un exa et je dois bosser.

Sinon, merci pour ta remarque constructive concernant le IN.
__________________
Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5
LhIaScZkTer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 12h34   #16
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Remarque générale : j'en ais marre de faire des cours en ligne et des bouquins qui ne sont pas lus et provoque des questions ou des réactions qui me paraissent honteuses tant elle sont du domaine du basique !!!!

1) cette syntaxe est en effet propre à SQL Server
2) la syntaxe normative pour utiliser une sous requête se base sur le ROW VALUE CONSTRUCTOR, hélas rarement implémenté...

Si vous aviez lu mon livre (synthex), voici ce que vous y auriez trouvé :

* * *

6.5 suppression de ligne avec DELETE
La suppression des lignes d'une table, par l'intermédiaire d'une spécification de table ou de vue répond à la syntaxe suivante :
Code :
1
2
DELETE [ FROM ] [ ONLY ] <table_ou_vue> 
[ WHERE ] <prédicat>
REMARQUE
• si la table visée est un type table le mot clef ONLY spécifie que seule la table visée est impactée. Dans le cas contraire, toutes les tables héritées sont impactées;
• l'omission de la clause WHERE supprime toutes les lignes de la table.

6.5.1 suppressions directes
Voici quelques exemple de l'utilisation de l'ordre SQL DELETE :
Code :
1
2
DELETE FROM T_UTILISATEUR_USR
WHERE  USR_ID = 7
Cette requête supprime la ligne d'identifiant 7 de la table T_UTILISATEUR_USR.

Code :
1
2
DELETE FROM T_UTILISATEUR_USR
WHERE  USR_ID BETWEEN 7 AND 10
Cette requête supprime les lignes dont les identifiants sont compris entre 7 et 10 inclus, de la table T_UTILISATEUR_USR.

Code :
1
2
3
DELETE FROM T_UTILISATEUR_USR
WHERE  USR_NOM LIKE '%e%' COLLATE SQLTEXT
  AND  USR_PRENOM = LOWER(USR_PRENOM)
Cette requête supprime les lignes dont le nom contient la lettre 'e' et le prénom est écrit en minuscule.

Code :
DELETE FROM T_UTILISATEUR_USR
Cette requête supprime toutes les lignes.

6.5.2 suppressions utilisant une sous requête
Voici quelques exemple de l'utilisation de l'ordre SQL DELETE combiné à une sous requête simple :
Code :
1
2
3
DELETE FROM T_UTILISATEUR_USR
WHERE  USR_ID < (SELECT AVG(USR_ID
                 FROM   T_UTILISATEUR_USR)
Cette requête supprime les lignes de la table T_UTILISATEUR_USR dont l'identifiant est inférieur à la moyenne des identifiants.

Code :
1
2
3
4
5
6
7
DELETE FROM T_UTILISATEUR_USR
WHERE  USR_ID < ALL (SELECT USR_ID
                     FROM   T_UTILISATEUR_USR
                     WHERE  USR_ID < (SELECT AVG(USR_ID) 
                                      FROM   T_UTILISATEUR_USR)
                       AND  USR_ID NOT IN (SELECT USR_ID 
                                           FROM T_NEWS_NEW))
Cette requête supprime les lignes de la table T_UTILISATEUR_USR dont l'identifiant est inférieur à tous les identifiants inférieurs à la moyenne des identifiants et qui ne sont pas des identifiants d'utilisateur ayant posté des news.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
DELETE FROM T_UTILISATEUR_USR
WHERE  (USR_NOM, USR_PRENOM) IN (SELECT MAX(USR_NOM), MIN(USR_PRENOM)
                                 FROM   T_UTILISATEUR_USR
                                 UNION
                                 SELECT MIN(USR_NOM), MAX(USR_PRENOM)
                                 FROM   T_UTILISATEUR_USR
                                 UNION
                                 SELECT MIN(USR_NOM), MIN(USR_PRENOM)
                                 FROM   T_UTILISATEUR_USR
                                 UNION
                                 SELECT MAX(USR_NOM), MAX(USR_PRENOM)
                                 FROM   T_UTILISATEUR_USR)
Cette requête supprime les lignes de la table T_UTILISATEUR_USR pour lesquelles le couple de colonnes nom, prénom est une combinaison des noms et prénoms maximum et minimum de la table T_UTILISATEUR_USR.

Voici quelques exemple de l'utilisation de l'ordre SQL DELETE combiné à une sous requête corrélée :
Code :
1
2
3
4
DELETE FROM T_UTILISATEUR_USR USR
WHERE  USR_ID NOT EXISTS (SELECT *
                          FROM   T_NEWS_NEW NEW
                          WHERE  NEW.USR_ID = USR.USR_ID)
Cette requête supprime les lignes de la table T_UTILISATEUR_USR pour les utilisateurs n'ayant pas posté de news.

Code :
1
2
3
4
5
6
7
8
DELETE FROM T_UTILISATEUR_USR USR
WHERE  (USR_NOM, USR_PRENOM) <> (SELECT UPPER(USR_NOM), UPPER(USR_PRENOM)
                                 FROM   T_UTILISATEUR_USR USR2
                                        LEFT OUTER JOIN T_NEWS_NEW NEW
                                             ON  USR2.USR_ID = NEW.USR_ID
                                 WHERE  USR2.USR_ID = USR.USR_ID
                                 GROUP  BY USR_ID
                                 HAVING COUNT(*) < 3)
Cette requête supprime les lignes de la table T_UTILISATEUR_USR pour les utilisateurs dont le couple de colonnes nom, prénom n'est pas en majuscules et qui ont posté moins de trois news.

* * *

Deux de ces exemples montre l'utilisation du RVC dans le cas de DELETE avec sous requête...

Pour SQL Server, il suffit d'aller dans l'aide en ligne sur le DELETE pour trouver la réponse. L'aide en ligne est très bien faite et en plus en français....
Ainsi à la page ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.fr/s10de_1devconc/html/8d339936-b2fe-4be3-891a-87088d825fe9.htm
(SQL Server 2008), on trouve l'exemple suivant :

# # #

L'exemple suivant montre l'extension Transact-SQL utilisée pour supprimer des enregistrements d'une table de base en fonction d'une jointure ou d'une sous-requête corrélée. La première instruction DELETE montre une sous-requête compatible ISO tandis que la seconde instruction DELETE montre l'extension Transact-SQL. Les deux requêtes suppriment des lignes de la table SalesPersonQuotaHistory, en se basant sur les titres stockés dans la table SalesPerson.

Code :
1
2
3
4
5
6
7
8
9
-- SQL-2003 Standard subquery
USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE BusinessEntityID IN 
    (SELECT BusinessEntityID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
Code :
1
2
3
4
5
6
7
8
9
-- Transact-SQL extension
USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
SELECT * FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
GO
# # #

C'est clair net et précis !

Bref, je ne peut pas m'empêcher que vous avez perdu beaucoup de temps pour pas grand chose...

Malheureusement ce que je constate tous les jours, c'est que les étudiants sont de moins en moins bien formés aux SGBDR. Et l'enseignant que je suis, milite depuis 10 ans pour plus d'espace pour les SGBDR dans les cours... Mais dans les faits c'est de moins en moins le cas.

ENFIN
Mes attaques ne sont jamais personnelles. Comme je ne vous connais pas personnellement, cela n'aurait pas de sens de vous qualifier de quoi que ce soit, en plus d'être sans doute diffamatoire.
Chaque fois que j'ai traité d'idiot ou d'imbécile, ce qui est vrai, ce sont pour qualifier vos propos.
Relisez bien ce que j'ai posté.
Que vous les ayez pris pour argent comptant, me laisse à penser que vous n'êtes pas si intelligent que ça au fond !!!

Modérateur ?Oui, c'est vrai je le suis. En fait c'est parce que j'ai créé il y a plus de 10 ans le forum sur lequel vous êtes... Mais sachez que je ne modère jamais, sauf si les propos sont injurieux ou diffamatoire. Dire que quelqu'un est con est diffamatoire si on ne peut pas prouver ses dires. Or par Internet nous ne nous connaissons pas, donc c'est la plupart du temps diffamatoire... Là je modère (et c'est très exceptionnel, peut être 2 fois en 10 ans).

TERMINATOR
La raison pour laquelle mes propos ont la dent dure est très simple.
1) je suis un vieux con (si, si à plus de 50 ans, je peut me permettre de l'affirmer)
2) j'ai remarqué depuis bien longtemps que l'on était plus écouté et que l'on suscitait plus de débats lorsque l'on fait le méchant comme TERMINATOR plutôt que le gentil à la Sissi !
3) la preuve, ce troll ! Vous êtes tombé dans le panneau...

EN CONCLUSION :
Je pense que vous vous souviendrez de cette syntaxe pour au moins les 10 ans qui viennent !!!!

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 30
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h59.


 
 
 
 
Partenaires

Hébergement Web