IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

SQL SELECT WHERE NOT EXISTS


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut SQL SELECT WHERE NOT EXISTS
    Bonjour,
    Je souhaite rechercher dans une meme table, les données qui sont en francais, mais qui ne sont pas présentes en anglais.
    Voici un exemple :
    TABLE1
    CD_LANG CLE LIBELLE
    FR 1 libelle1
    FR 2 libelle2
    FR 3 libelle3
    FR 4 libelle4
    EN 1 libelle5
    EN 4 libelle6
    Je souhaite donc recuperer les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FR	2	libelle2
    FR	3	libelle3
    et voici ma requête qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT CLE
    FROM TABLE1
    WHERE NOT IN
      (SELECT *
         FROM TABLE1 A,
              TABLE1 B
    WHERE   A.CD_LANG = 'FR'
       AND  B.CD_LANG = 'EN'
       AND  A.CLE  = B.CLE);
    Sachant que ma requête entre () fonctionne, mais imbriquée dans un NOT IN ou un NOT EXISTS cela ne fonctionne pas.

    Merci d'avance pour votre aide

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    tu peux tester ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CLE FROM TABLE1 A
    WHERE A.CD_LANG = 'FR'
    AND NOT EXISTS
        (SELECT * FROM TABLE1 B,
        WHERE B.CD_LANG = 'EN'
        AND A.CLE = B.CLE);

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Impeccable
    Merci beaucoup, cela a fonctionné.
    Et pourtant, j'étais sûr d'avoir déjà fait ce test-là!

  4. #4
    Membre à l'essai
    Femme Profil pro
    Autre
    Inscrit en
    Octobre 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Octobre 2022
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour
    J'ai lu attentivement et essayé de reproduire... mais pas moyen ...
    J'ai un module d'importation de données, dans lequel je souhaite intégrer un ajout de donnée à la condition qu'elle ne figure pas déjà, mais je n'arrive pas rédiger la condition WHERE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim AjoutDebDDFIP As String
     
    AjoutDebDDFIP = " INSERT INTO T033_DDFiP_Reponse_Debiteur1 (debiteur1)"
    AjoutDebDDFIP = AjoutDebDDFIP + " SELECT T09b_GFC.[RESP]"
    AjoutDebDDFIP = AjoutDebDDFIP + " FROM T09b_GFC LEFT JOIN T033_DDFiP_Reponse_Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " ON T09b_GFC.RESP = T033_DDFiP_Reponse_Debiteur1.Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " WHERE NOT EXISTS (T033_DDFiP_Reponse_Debiteur1.Debiteur1)"
     
    DoCmd.RunSQL AjoutDebDDFIP
    Le but est que l'import de la donnée T09b_GFC.RESP se fasse dans la table T033_DDFiP_Reponse_Debiteur1 à la condition que T033_DDFiP_Reponse_Debiteur1.Debiteur1 n'existe pas déjà.

    Dans la table, le champ Debiteur1 est indexé avec doublon, mais n'est pas la clé primaire.

    Je suis reconnaissante d'avance pour le temps pris pour m'aider !
    Bonne journée

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    @FNaas : il manque la clause FROM et la clause WHERE dans votre requête corrélée WHERE NOT EXISTS.

    Cette requête devrait se présenter comme suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into [...]
    select [...]
    from  ma_table1 as T1
    where [...]
      and not exists 
         (select [...]
          from ma_table2 as T2
          where T2.col1 = T1.col1 
         )

  6. #6
    Membre à l'essai
    Femme Profil pro
    Autre
    Inscrit en
    Octobre 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Octobre 2022
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour
    Merci pour cette aide, voici comment j'ai rédigé le code, est-ce correct ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim AjoutDebDDFIP As String
     
    AjoutDebDDFIP = " INSERT INTO T033_DDFiP_Reponse_Debiteur1 (debiteur1)"
    AjoutDebDDFIP = AjoutDebDDFIP + " SELECT T09b_GFC.[RESP]"
    AjoutDebDDFIP = AjoutDebDDFIP + " FROM T09b_GFC LEFT JOIN T033_DDFiP_Reponse_Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " ON T09b_GFC.RESP = T033_DDFiP_Reponse_Debiteur1.Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " WHERE (((T09b_GFC.RESP) = (T033_DDFiP_Reponse_Debiteur1.Debiteur1)))"
    AjoutDebDDFIP = AjoutDebDDFIP + " AND NOT EXISTS (SELECT T09b_GFC.[RESP]"
    AjoutDebDDFIP = AjoutDebDDFIP + " FROM T033_DDFiP_Reponse_Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " WHERE T033_DDFiP_Reponse_Debiteur1 = T09b_GFC.[RESP]"
     
    DoCmd.RunSQL AjoutDebDDFIP
    Mais mon import ne fonctionne plus avec ce code dans mon module.
    Voici le module au complet, j'obtiens un message qui apparaît lorsque le fichier EXCEL à importer est ouvert, or il ne l'est pas... est-ce parce que j'ai 2 instructions d'AJOUT à partir de la même table T09b_GFC ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    Option Compare Database
    Option Explicit
     
    Public Function ImportDBF()
     
    'importe les créances GFC au format DBF et ajoute dans la table T022_creances toutes les informations correspondantes
     
       'Déclaration variable
    Dim dialogFichier As Object
    Dim nomFichier As String
    Dim reqDelete, reqInsert As String
     
    DoCmd.SetWarnings False
     
    'Création de la boite
    '1 = ouvrir ,  = enregistrer sous , 3 = récuperation d'un fichier
    Set dialogFichier = Application.FileDialog(3)
     
    'Ne pas autoriser la selection de plus d'un fichier
    dialogFichier.AllowMultiSelect = False
     
    'Filtrer le typede fichier autorisé
    dialogFichier.Filters.Clear
    dialogFichier.Filters.Add "Fichier *.DBF obtenu en cliquant sur la disquette au-dessus de la liste des créances", "*.DBF", 1
     
    'Chemin lors de l'ouverture de la boite (là où se trouve le fichier EssatédéSCO)
    dialogFichier.InitialFileName = CurrentProject.Path
     
    'Afficher la boite
    dialogFichier.Show
     
    'Si l'utilisateur ne selectionne pas de fichier
    If dialogFichier.SelectedItems.Count = 0 Then
     
    'Affiche un message
    MsgBox "Vous n'avez pas selectionné de fichier"
     
    Else
    'Supprime les espaces avant et apres le nom du fichier
    nomFichier = Trim(dialogFichier.SelectedItems(1))
     
    'Recuperer le nom du fichier sans le chemin
    Dim chemin As String
    Dim justFile As String
    justFile = Right(nomFichier, Len(nomFichier) - InStrRev(nomFichier, "\"))
    chemin = Left(nomFichier, Len(nomFichier) - Len(justFile))
     
     
    On Error GoTo HuitCaracteres
     
    DoCmd.TransferDatabase acImport, "dbase III", chemin, acTable, justFile, "T09b_GFC"
     
     
    'Verser cette importation dans la table T022_creances
     
    Dim AjoutCreances As String
     
    AjoutCreances = " INSERT INTO T022_creances (ETSNUM, Numero_creance, Origine, Compte_classe_4,"
    AjoutCreances = AjoutCreances + " Reference_facture, debiteur1, Montant_initial, Montant_net,"
    AjoutCreances = AjoutCreances + " Date_emission_creance)"
    AjoutCreances = AjoutCreances + " SELECT T09b_GFC.[ETABLIS], T09b_GFC.[NUMERO],"
    AjoutCreances = AjoutCreances + " T09b_GFC.Origine, T09b_GFC.[COMPTE],"
    AjoutCreances = AjoutCreances + " T09b_GFC.REFERENCE, T09b_GFC.[RESP],"
    AjoutCreances = AjoutCreances + " T09b_GFC.[MONTANTE], T09b_GFC.[MONTANTG],"
    AjoutCreances = AjoutCreances + " T09b_GFC.DATETRIM"
    AjoutCreances = AjoutCreances + " FROM T09b_GFC LEFT JOIN T022_creances"
    AjoutCreances = AjoutCreances + " ON T09b_GFC.NUMERO = T022_creances.Numero_creance"
    AjoutCreances = AjoutCreances + " WHERE (((T022_creances.Numero_creance) Is Null))"
     
    DoCmd.RunSQL AjoutCreances
     
    Dim AjoutDebDDFIP As String
     
    AjoutDebDDFIP = " INSERT INTO T033_DDFiP_Reponse_Debiteur1 (debiteur1)"
    AjoutDebDDFIP = AjoutDebDDFIP + " SELECT T09b_GFC.[RESP]"
    AjoutDebDDFIP = AjoutDebDDFIP + " FROM T09b_GFC LEFT JOIN T033_DDFiP_Reponse_Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " ON T09b_GFC.RESP = T033_DDFiP_Reponse_Debiteur1.Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " WHERE (((T09b_GFC.RESP) = (T033_DDFiP_Reponse_Debiteur1.Debiteur1)))"
    AjoutDebDDFIP = AjoutDebDDFIP + " AND NOT EXISTS (SELECT T09b_GFC.[RESP]"
    AjoutDebDDFIP = AjoutDebDDFIP + " FROM T033_DDFiP_Reponse_Debiteur1"
    AjoutDebDDFIP = AjoutDebDDFIP + " WHERE T033_DDFiP_Reponse_Debiteur1 = T09b_GFC.[RESP]"
     
    DoCmd.RunSQL AjoutDebDDFIP
     
     
    Dim MajCreances As String
     
    MajCreances = " UPDATE T022_creances INNER JOIN T09b_GFC"
    MajCreances = MajCreances + " ON T022_creances.Numero_creance = T09b_GFC.NUMERO"
    MajCreances = MajCreances + " SET T022_creances.ETSNUM = T09b_GFC.ETABLIS,"
    MajCreances = MajCreances + " T022_creances.Origine = T09b_GFC.Origine,"
    MajCreances = MajCreances + " T022_creances.Compte_classe_4 = T09b_GFC.COMPTE,"
    MajCreances = MajCreances + " T022_creances.Reference_facture = T09b_GFC.REFERENCE,"
    MajCreances = MajCreances + " T022_creances.debiteur1 = T09b_GFC.RESP,"
    MajCreances = MajCreances + " T022_creances.Montant_initial = T09b_GFC.MONTANTE,"
    MajCreances = MajCreances + " T022_creances.Montant_net = T09b_GFC.MONTANTG,"
    MajCreances = MajCreances + " T022_creances.Date_emission_creance = T09b_GFC.DATETRIM"
     
    DoCmd.RunSQL MajCreances
     
    DoCmd.DeleteObject acTable, "T09b_GFC"
     
    'Demander si l'on veut garder les créances récentes
     
    If MsgBox("Voulez-vous supprimer les créances récentes ? (4112 et 4122)", vbYesNo + vbQuestion) = vbYes Then
     
    'Supprimer les créances du 4112
     
    Dim sup4112 As String
    sup4112 = " DELETE FROM T022_creances WHERE left(Compte_classe_4, 4) = '4112' "
    DoCmd.RunSQL sup4112
     
    'Supprimer les créances du 4122
    Dim sup4122 As String
    sup4122 = " DELETE FROM T022_creances WHERE left(Compte_classe_4, 4) = '4122' "
    DoCmd.RunSQL sup4122
     
    Else
    Call OuvrirFormulaire("F032_Consulter_creances_FP")
     
    End If
     
    End If
     
    Exit Function
     
    HuitCaracteres:
     
    'Si on est dans Access 2013 pas la peine de palabrer on envoie les gens vers l'import Excel
    If Application.Version = "15.0" Then Call ImportXLS
     
    'Sinon ou bien l'erreur vient du nom de fichier à mettre en 8.3, ou bien c'est un Access 2016 pas à jour
    If Application.Version = "16.0" Then
    If MsgBox("1) Problème de fichier ouvert : fermez le fichier creances" & vbCrLf & vbCrLf & "2) Problème de nom du fichier importé : annulez et donnez un nom plus court à votre fichier DBF (maximum 8 caractères alphanumériques)" & vbCrLf & vbCrLf & "3) Problème de mise à jour de votre Access 2016, faites tourner Windows Update. Si vous êtes pressé.e, en faisant OK vous pourriez importer un fichier modifié au format Excel", vbOKCancel, "Erreur lors de l'importation - trois situations sont possibles") = vbOK Then Call ImportXLS
     
    Else
     
    MsgBox ("Problème de nom du fichier importé : annulez et donnez un nom plus court à votre fichier DBF (maximum 8 caractères alphanumériques)")
     
     
    End If
     
    End Function

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Ligne 10 : il manque une parenthèse fermante après = T09b_GFC.[RESP].
    Ligne 07 : il y a une pléthore de parenthèses inutiles qui nuisent à la lisibilité et expliquent peut-être l'erreur qui précède
    remplacer
    WHERE (((T09b_GFC.RESP) = (T033_DDFiP_Reponse_Debiteur1.Debiteur1))).
    par
    WHERE T09b_GFC.RESP = T033_DDFiP_Reponse_Debiteur1.Debiteur1.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insert .. where not exists
    Par Zolex dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/03/2007, 11h26
  2. sql server does not exist or access is denied
    Par Immobilis dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 15/03/2006, 15h11
  3. SQL Server does not exist or access denied
    Par jfc dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 09/01/2006, 14h29
  4. Select ... Where.. NOT IN
    Par backus dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/11/2005, 19h11
  5. Requête SQL ( relation does not exist)
    Par norvel dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/10/2005, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo