Correction d'une requete SQL Delete....

Correction d'une requete SQL Delete.... - SQL/NoSQL - Programmation

Marsh Posté le 18-04-2007 à 17:21:33    

yop yop
 
qqn pourrais me corriger cette requete qui ne fonctionne pas ?  
 

Code :
  1. DELETE
  2. FROM ProfilesGroups pg, Groups g
  3. WHERE pg.tpGroupID = g.gId
  4.    AND pg.tpProfileID = '7df60fae-a026-4a0b-878a-0dd7e5308b09'
  5.    AND g.gProfileID = '8a6859ce-9f99-4aaf-9ed6-1af66cd15894'


 
En fait j'aimerais supprimer le profil x (ici 7df60fae-a026-4a0b-878a-0dd7e5308b09) de tous les groupes d'utilisateurs qui m'appartiennent (8a6859ce-9f99-4aaf-9ed6-1af66cd15894 = mon identifiant).
 
Merci, +++

Reply

Marsh Posté le 18-04-2007 à 17:21:33   

Reply

Marsh Posté le 18-04-2007 à 17:53:09    

t'est sur de ça ?  pg.tpGroupID = g.gId


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 19-04-2007 à 08:30:47    

zecrazytux a écrit :

t'est sur de ça ?  pg.tpGroupID = g.gId


 
euh.... bah c'est la relation entre les 2 tables koi

Reply

Marsh Posté le 19-04-2007 à 09:01:43    

sur MSDN j'ai trouvé l'exemple suivant, mais impossible de l'appliquer à ma requete.... (si possible sans utiliser les INNER JOIN...)
 
DELETE FROM Sales.SalesPersonQuotaHistory  
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

Reply

Marsh Posté le 19-04-2007 à 10:48:13    

Ta requete ne marche pas fonctionnellement ou techniquement ? Tu cherche à l'executer sous quel sgbd ?

Reply

Marsh Posté le 19-04-2007 à 11:10:50    

DELETE ne peut supprimer que dans une table à la fois.
Par contre, afin de gérer les relations entre les tables, on peut joindre cette table à d'autres.
 
Syntaxe SQL Server :
 

Code :
  1. DELETE ProfilesGroups
  2. FROM ProfilesGroups pg INNER JOIN Groups g ON tpGroupID = g.gId
  3. WHERE pg.tpProfileID = '7df60fae-a026-4a0b-878a-0dd7e5308b09'   AND g.gProfileID = '8a6859ce-9f99-4aaf-9ed6-1af66cd15894'


 
Cette syntaxe est propriétaire SQL Server, et ne fonctionne que sur ce produit. D'autres SGBD disposent de différentes syntaxes propriétaires aussi. Consulte donc la documentation du SGBD que tu utilises (à la version près !)
 
(ceci dit, je ne vois pas pourquoi tu utilises ça "pg.tpProfileID = '7df60fae-a026-4a0b-878a-0dd7e5308b09'" <- là tu ne supprimque qu'un truc)
 
Ensuite, pour supprimer tous les profiles d'un groupe par exemple, logiquement :
 
-> Dans la table des profiles t'as un champ indiquant le groupe. Donc tu peux aisément retrouver la liste des profils à supprimer, sans passer par le groupe.
-> Si c'est plus complexe, mais tes relations correctement écrite, et qu'en plus tu veux supprimer le groupe avec ses profiles, l'utilisation des fonctionnalités de "CASCADE CONSTRAINT" est particulièrement conseillée (standard)

Reply

Marsh Posté le 19-04-2007 à 13:35:52    

MagicBuzz a écrit :

DELETE ne peut supprimer que dans une table à la fois.
Par contre, afin de gérer les relations entre les tables, on peut joindre cette table à d'autres.
 
Syntaxe SQL Server :
 

Code :
  1. DELETE ProfilesGroups
  2. FROM ProfilesGroups pg INNER JOIN Groups g ON tpGroupID = g.gId
  3. WHERE pg.tpProfileID = '7df60fae-a026-4a0b-878a-0dd7e5308b09'   AND g.gProfileID = '8a6859ce-9f99-4aaf-9ed6-1af66cd15894'


 
Cette syntaxe est propriétaire SQL Server, et ne fonctionne que sur ce produit. D'autres SGBD disposent de différentes syntaxes propriétaires aussi. Consulte donc la documentation du SGBD que tu utilises (à la version près !)
 
(ceci dit, je ne vois pas pourquoi tu utilises ça "pg.tpProfileID = '7df60fae-a026-4a0b-878a-0dd7e5308b09'" <- là tu ne supprimque qu'un truc)
 
Ensuite, pour supprimer tous les profiles d'un groupe par exemple, logiquement :
 
-> Dans la table des profiles t'as un champ indiquant le groupe. Donc tu peux aisément retrouver la liste des profils à supprimer, sans passer par le groupe.
-> Si c'est plus complexe, mais tes relations correctement écrite, et qu'en plus tu veux supprimer le groupe avec ses profiles, l'utilisation des fonctionnalités de "CASCADE CONSTRAINT" est particulièrement conseillée (standard)


 
Hello! Merci pour ta réponse! J'utilise bien SQL, mais dans sa version "Compact Edition"
 
La requete que tu proposes ne fonctionne pas... je suis en-train de me demander si c'est pas une limitation au niveau de SQLce...
 
J'ai 3 tables :
 
Profiles

  • id
  • login
  • pass


Goups

  • id
  • owner (= id du profile à qui appartient le groupe)
  • name


ProfilesGroups

  • profileId
  • groupId


Un profile peut donc faire parti de plusieurs groupes (qui eux appartiennent à la même personne(profile)).
 
Donc lorsque la personne supprime un profile, je lui demande si elle veut supprimer ce profil uniquement du groupe actuel ou de tous les groupes ou il apparait (-> la requete de ce post devrait fonctionner pour une suppression du profile dans tous les groupes (appartenant à la personne...)!)
 
Merci pour votre aide ;)
 
++


Message édité par le_duc le 19-04-2007 à 13:37:28
Reply

Marsh Posté le 19-04-2007 à 13:44:34    

Sympa le duc deviter ma question, continue à m'ignorer PAUVRE TYPE

Reply

Marsh Posté le 19-04-2007 à 14:04:30    

jeriko6911 a écrit :

Sympa le duc deviter ma question, continue à m'ignorer PAUVRE TYPE


 
bah je t'ai répondu la 1ere fois.... et la 2e je l'ai pas vu!
 
T'as une partie de la réponse dans mon post précédant (SQL Compact Edition) et l'erreur retournée est la suivante (avec la requete proposée par MagicBuzz) :
 
Major Error 0x80040E14, Minor Error 25501
> DELETE  
FROM ProfilesGroups pg  
INNER JOIN Groups g ON tpGroupID = g.gId
WHERE pg.tpProfileID = '7df60fae-a026-4a0b-878a-0dd7e5308b09'
  AND g.gProfileID = '8a6859ce-9f99-4aaf-9ed6-1af66cd15894'
There was an error parsing the query. [ Token line number = 2,Token line offset = 21,Token in error = pg ]
 
....

Reply

Marsh Posté le 19-04-2007 à 14:11:18    

Effectivement, SQL Server CE est TRES limité.
 
Je pense que le plus simple, c'est de faire un SELECT pour retrouver les lignes à supprimer, puis les supprimer une à une.
 
J'ai pas de SQL Server CE sous la main, et en plus c'est la tanée pour faire des tests dessus, donc chaud les marrons pour trouver mieux.
 
L'intérêt de faire ça, même si c'est pas ce qu'il y a de plus propre, c'est que tu es sûr que ça marche, même si demain tu déploies ton application avec autrechose que SQL Server CE ou une autre version du produit.
 
PS : Je ne sais plus s'il supporte les transactions. Si c'est le cas, surtout utilises-en une. Ca évitera d'avoir des données instables en cas d'erreur.

Reply

Marsh Posté le 19-04-2007 à 14:11:18   

Reply

Marsh Posté le 19-04-2007 à 18:33:48    

MagicBuzz a écrit :

Effectivement, SQL Server CE est TRES limité.
 
Je pense que le plus simple, c'est de faire un SELECT pour retrouver les lignes à supprimer, puis les supprimer une à une.
 
J'ai pas de SQL Server CE sous la main, et en plus c'est la tanée pour faire des tests dessus, donc chaud les marrons pour trouver mieux.
 
L'intérêt de faire ça, même si c'est pas ce qu'il y a de plus propre, c'est que tu es sûr que ça marche, même si demain tu déploies ton application avec autrechose que SQL Server CE ou une autre version du produit.
 
PS : Je ne sais plus s'il supporte les transactions. Si c'est le cas, surtout utilises-en une. Ca évitera d'avoir des données instables en cas d'erreur.


 
il ne supporte pas les transactions malheureusement ;)

Reply

Marsh Posté le 20-04-2007 à 11:21:32    


Je confirme que SQL CE ne supporte pas les delete impliquant plusieurs tables!
 
Il faut donc faire plusieurs requetes séparées pour arriver à ce résultat ;-).
 
++

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed