Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 25/04/2007, 17h04   #1
Membre Expert
 
Avatar de nebule
 
Inscription : octobre 2004
Messages : 1 509
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 1 509
Points : 1 337
Points : 1 337
Par défaut [Erreur -104] Le select marche mais pas le delete ?!

Bonjour,


Rapidement pour le contexte, j'ai ma table avec :

clé, date, personne

on peut avoir pour une clé et une date différente plusieurs enregistrement par personne :

1;01-02-2006;personne1
2;01-05-2006;personne1
3;01-03-2006;personne2
4;01-06-2006;personne2

J'ai besoin dans ma table de supprimer tous les éléments qui n'ont pas la date max (groupé par personne) et donc de ne conserver dans l'exemple précédent que les enregistrements 2 et 4.

J'ai donc ma requête de sélection qui fonctionne impec et me renvoi les bons résultats :
Code :
1
2
3
4
5
6
7
 
SELECT
max(date), cle, personne
FROM matable
WHERE 
date< {d '2007-04-25'}
GROUP BY personne, cle
par contre, quand je mets mon delete autours, j'ai une belle erreur 104. Malgré les messages sur le forum indiquant qu'il s'agit d'une erreur de syntaxe, je ne trouve pas ma bourde :

Le delete en question :

Code :
1
2
3
4
5
6
DELETE FROM matable WHERE (date,cle) NOT IN (SELECT
max(date), cle, personne
FROM matable
WHERE 
date< {d '2007-04-25'}
GROUP BY personne, cle);
et la belle erreur :

Citation:
Error: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 79
,, SQL State: HY000, Error Code: 335544569
Situant l'erreur au niveau de la virgule séparant (date,cle) sur la première ligne de mon delete.

Merci
__________________
(\ _ /)
(='.'=)
(")-(")
nebule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 17h54   #2
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 758
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 758
Points : 6 779
Points : 6 779
Salut

Code :
1
2
... WHERE (date,cle) NOT IN ...
C'est là que ça coince! Une sous-requête ne peut se référer qu'à un seul champ. Non ?

Perso je serais passé par une PS.

@+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2007, 19h47   #3
Membre à l'essai
 
Inscription : avril 2005
Messages : 25
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 25
Points : 23
Points : 23
Je crainds que ceci ne soit une fonctionnalité FB 2.0 (mais je n'ai pas vérifié).
En palliatif, il est peut être envisageable d'utiliser une concaténation genre:

DELETE FROM matable WHERE date||personne NOT IN (SELECT
max(date), personne
FROM matable
WHERE
date< {d '2007-04-25'}
GROUP BY personne);

Attention aux cas des dates nulles ;o)
Slts
PAscal
pascal_legrand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 08h46   #4
Membre Expert
 
Avatar de nebule
 
Inscription : octobre 2004
Messages : 1 509
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 1 509
Points : 1 337
Points : 1 337
Bonjour,

Effectivement, je suis de moins en moins persuadée de la bonne utilisation de cette formule sous firebird (l'idée venant d'un utilisateur d'une base oracle ...)

La concaténation proposée par Pascal n'est pas plus concluante :

Citation:
SQL error code = -104
Invalid command
count of column list and variable list do not match
Au début j'étais partie sur une requête de ce type :

Code :
1
2
3
4
5
6
DELETE FROM SECTION_ASSIGNMENT WHERE SECTION_ASSIGNMENT_KEY NOT IN (SELECT SECTION_ASSIGNMENT_KEY FROM (SELECT
max(ASSIGNMENT_START_DATE), SECTION_ASSIGNMENT_KEY
FROM SECTION_ASSIGNMENT
WHERE ASSIGNMENT_END_DATE IS NULL
AND ASSIGNMENT_START_DATE < {d '2007-04-25'}
GROUP BY EMPLOYEE_KEY, SECTION_ASSIGNMENT_KEY))
Mais sans grande solution non plus, erreur : [QUOTE]Error: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Invalid command
COLUMN 1 is specified without a name, SQL State: HY000, Error Code: 335544569[QUOTE]

Pas d'autres idées ?

Merci
__________________
(\ _ /)
(='.'=)
(")-(")
nebule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 09h32   #5
Membre Expert
 
Avatar de nebule
 
Inscription : octobre 2004
Messages : 1 509
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 1 509
Points : 1 337
Points : 1 337
Bon finalement pas de solutions trouvées mais je fais autrement ...

Effectivement cette syntaxe avec firebird ne semble pas acceptée
__________________
(\ _ /)
(='.'=)
(")-(")
nebule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 12h26   #6
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Code :
1
2
3
4
5
6
DELETE FROM SECTION_ASSIGNMENT WHERE
 SECTION_ASSIGNMENT_KEY NOT IN (SELECT C2 FROM (SELECT 
max(ASSIGNMENT_START_DATE) C1, SECTION_ASSIGNMENT_KEY C2 FROM 
SECTION_ASSIGNMENT WHERE ASSIGNMENT_END_DATE IS NULL AND 
ASSIGNMENT_START_DATE < {d '2007-04-25'} GROUP BY EMPLOYEE_KEY, 
SECTION_ASSIGNMENT_KEY))
il faut donner un alias aux champs dans le sous select
cf page 24 des dernières notes de version :
Citation:
Points to Note
• Every column in the derived table must have a name. Unnamed expressions like constants should be added
with an alias or the column list should be used.
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h53.


 
 
 
 
Partenaires

Hébergement Web