Page 1 sur 1

[OK]SQLite et DELETE

Publié : mar. 20/sept./2022 12:48
par Ar-S
J'ai encore un soucis avec SQLITE.

Dans ma table datetest j'ai colonne id et colonne dateR

J'aimerai faire en sorte de pouvoir limiter la suppression de lignes avec les même données X dans une certaine limit.
J'ai vu que SQLite en PB n'aimait pas les condition avec ORDER BY Y ASC LIMIT Z
J'ai donc formaté ma requète ainsi.

Code : Tout sélectionner

Procedure DeleteRow(Base, Ladate$, l$="1")
    Protected R
    R = MessageRequester("Confirmation","Souhaitez vous réellement supprimer la date "+Ladate$+ " ?",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
    Select R
        Case #PB_MessageRequester_Yes
             If OpenDatabase(#MaBase, Filename$, "", "")
                ;Requete$ = "DELETE FROM "+TableName$+ " WHERE "+ColDate$ + "='"+Ladate$+"' ORDER BY "+ColDate$+" ASC LIMIT "+l$
                Requete$ = "DELETE FROM "+TableName$+ " WHERE "+ColDate$ + "= (SELECT "+ColDate$+ " FROM "+TableName$+" WHERE "+ColDate$ + "='"+Ladate$+"' ORDER BY "+ColDate$ + " ASC LIMIT "+l$ +")"
                Debug Requete$
                Result = DatabaseUpdate(Base, Requete$)
                If Result = 0
                    erreur$ = DatabaseError()
                    Debug "Erreur delete : " + erreur$
                Else
                    Debug Ladate$ + " a été supprimé !"
                    Result = 1
                EndIf
                FinishDatabaseQuery(#MaBase)
                CloseDatabase(#MaBase)
            EndIf
        Case #PB_MessageRequester_No
            Result = 0
        Default
            Result = 0
    EndSelect
    ProcedureReturn Result
EndProcedure
Ce qui m'affiche comme requete lorsque je fais : DeleteRow(#MaBase,"2022-04-04")

Code : Tout sélectionner

DELETE FROM datetest WHERE dateR= (SELECT dateR FROM datetest WHERE dateR='2022-04-04' ORDER BY dateR ASC LIMIT 1)
Ce qui me parait bien.
Sauf que mon LIMIT 1 passe à la trappe et toutes les lignes contenant "2022-04-04" dans dateR sont virées. Faut peut être passer par un DatabaseQuery() avant ? J'avoue que je suis un peu peaumé

Amis de la BDD si vous passez par là.

Re: SQLite et DELETE

Publié : mar. 20/sept./2022 16:12
par Marc56
Il faut que SQLite soit compilé avec l'option: SQLITE_ENABLE_UPDATE_DELETE_LIMIT Ce qui ne semble pas être le cas ici.

Source: https://www.sqlite.org/compile.html#ena ... lete_limit
:wink:

Re: SQLite et DELETE

Publié : mar. 20/sept./2022 19:56
par Ar-S
Oui j'avais lu ça, d’où l'imbrication

Code : Tout sélectionner

WHERE "+ColDate$ + "= (SELECT
As tu une autre solution (requete) pour résoudre ce soucis ?

Re: SQLite et DELETE

Publié : mar. 20/sept./2022 20:17
par Marc56
J'aimerai faire en sorte de pouvoir limiter la suppression de lignes avec les même données X dans une certaine limit.
...
DELETE FROM datetest WHERE dateR= (SELECT dateR FROM datetest WHERE dateR='2022-04-04' ORDER BY dateR ASC LIMIT 1)
J'ai un peu de mal à comprendre ce que tu veux faire ?
Si c'est juste supprimer les doublons ? (SELECT DISTINCT) ou autre-chose ?
:wink:

Re: SQLite et DELETE

Publié : mar. 20/sept./2022 22:46
par Ar-S
Non,

Je veux supprimer la 1ere occurrence d'une date A lorsque dans la base j'ai.

C
B
A <- virer la 1ère trouvée dans un sens donné (ASC ou DESC)
D
F
A
A
V

Re: SQLite et DELETE

Publié : mer. 21/sept./2022 1:27
par case

Re: SQLite et DELETE

Publié : mer. 21/sept./2022 14:30
par Marc56
Comme les ID sont attribués séquentiellement et non réutilisés, tu peux faire comme ceci si tu veux supprimer le premier entré dans la sélection.

Code : Tout sélectionner

DELETE FROM datetest
      WHERE id = (
                     SELECT min(id) 
                       FROM datetest
                      WHERE dateR = '2022-10-05 12:00:00'
                 );
(Testé)
Il y a surement plus simple, je ne connais que les bases du SQL.

PS. En SQLite, tu peux utiliser aussi les rowid (ils ne sont affichées qu'à la demande)

Code : Tout sélectionner

SELECT rowid, * FROM ...
Pour ne pas casser ta base à chaque essai, tu peux utiliser les transactions.

Code : Tout sélectionner

BEGIN <tests> puis COMMIT ou ROLLBACK
:wink:

Re: SQLite et DELETE

Publié : mer. 21/sept./2022 19:59
par Ar-S
@case, j'ai exploré pas mal de solution, ça ne passe pas. Surement du fait que le SQLite PB n'ai pas l'option SQLITE_ENABLE_UPDATE_DELETE_LIMIT

@Marc56

Code : Tout sélectionner

DELETE FROM datetest
      WHERE id = (
                     SELECT min(id) 
                       FROM datetest
                      WHERE dateR = '2022-10-05 12:00:00'
                 );
C'est pas con du tout. Je vais tester ça demain.

Re: SQLite et DELETE

Publié : mer. 21/sept./2022 22:03
par Ollivier
ArS a écrit :

Code : Tout sélectionner

;Requete$ = "DELETE FROM "+TableName$+ " WHERE "+ColDate$ + "='"+Ladate$+"' ORDER BY "+ColDate$+" ASC LIMIT "+l$
Au risque de passer pour une bille, il ne manquerait pas des guillemets ou apostrophes ? À part à Ladate$, à l$ par exemple ?

Re: SQLite et DELETE

Publié : mer. 21/sept./2022 22:42
par Ar-S
Non, la requete doit afficher LIMIT 1
Et ColDate est le nom de la colonne donc pas besoin. Seule Ladate$ doit être entouré de '
La requête donne ça :

Code : Tout sélectionner

DELETE FROM testdate WHERE dateR = '2020-xx-xx' ORDER BY dateR ASC LIMIT 1

Re: SQLite et DELETE

Publié : jeu. 22/sept./2022 2:05
par Ollivier
Et c'est bien '2020-xx-xx' ?
Pas '2020-mm-dd' ?

Re: SQLite et DELETE

Publié : jeu. 22/sept./2022 9:17
par Ar-S
Oui les xx pour l'exemple

Re: [OK]SQLite et DELETE

Publié : jeu. 22/sept./2022 9:24
par Ar-S
@Marc56 C'est OK avec ta requête. Merci encore.