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

Langage SQL Discussion :

Recherche d'absence de valeur dans une table [Débutant(e)]


Sujet :

Langage SQL

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut Recherche d'absence de valeur dans une table
    Le titre n'est pas très explicite.

    J'ai une table IMMEUBLE à laquelle est liée une table FINANCEMENT.

    Un immeuble peut avoir plusieurs financement, différenciés par une date de début et un type de financement différent. Il ne peut y avoir deux financement avec un même type pour la même date de début.

    Ce que je cherche à faire, c'est dans un premier temps de rechercher les immeubles ayant un financement d'un certain type pour une date de début données, puis de comparer le résultat obtenu avec tous les immeubles, afin de détecter quels immeubles n'ont pas ce type de financement pour une période déterminée.

    J'ai donc écrit la requête suivante :

    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
    SELECT imm.ID
        , imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    FROM IMMEUBLE AS imm
    WHERE imm.ID
        NOT IN (SELECT imm.ID 
        , fin.IMMEUBLE_ID_FK
        , fin.TYPE_FINANCEMENT_ID_FK
        FROM IMMEUBLE AS imm
        INNER JOIN FINANCEMENT AS fin
        ON fin.IMMEUBLE_ID_FK = imm.ID
        WHERE DATE_FORMAT(fin.DATE_DEBUT, '%d.%m.%Y') = '01.07.2013'
            AND fin.TYPE_FINANCEMENT_ID_FK IN (23))
    GROUP BY imm.ID
        , imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER;
    Ici, le résultat que j'aimerais obtenir, ce sont tous immeubles qui n'ont pas un financement de type 23 pour la période commençant le 01.07.2013.

    Exécutées individuellement, elles fonctionnent.

    J'ai cependant l'erreur suivante :

    Error Code: 1241. Operand should contain 1 column(s)
    Je ne vois pas mon erreur (et il y en a peut-être plusieurs).

    Merci d'avance pour votre aide.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    La sous-requête dans le (NOT) IN ne doit renvoyer qu'une seule colonne, or ici elle en renvoie 3.

    Je dirai aussi qu'il y a moyen d'optimiser la requête. Dans la sous-requête, il est inutile d'accéder à la table immeuble, il suffit de renvoyer fin.IMMEUBLE_ID_FK. Une jointure en moins !

    Autre piste: se passer de sous-requête, et utiliser une jointure externe.

    Tatayo.

  3. #3
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonjour Domi2,

    Le problème se situe au niveau de votre opérateur IN.
    Cet opérateur travail uniquement avec deux opérandes d'une seule colonne ou ensemble de valeur.
    Votre sous-requête doit retourner seulement une colonne, donc ici seulement imm.ID.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE imm.ID NOT IN (SELECT imm.ID FROM ....
    PS: Je me suis fait doubler Bonne journée

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Faut pas pleurer Oishiiii, moi aussi je viens de me faire griller, mais par David...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    J'ai donc modifié ma requête comme ceci, elle fonctionne :

    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
    SELECT imm.ID
        , imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    FROM IMMEUBLE AS imm
    INNER JOIN FINANCEMENT AS fin
        ON fin.IMMEUBLE_ID_FK = imm.ID
    WHERE imm.ID
        NOT IN (SELECT fin.IMMEUBLE_ID_FK
        FROM FINANCEMENT AS fin
        WHERE DATE_FORMAT(fin.DATE_DEBUT, '%d.%m.%Y') = '01.07.2013'
            AND fin.TYPE_FINANCEMENT_ID_FK IN (23))
    GROUP BY imm.ID
        , imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER;
    Merci à tous les deux
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  6. #6
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    La saison des grillades touche à sa fin, ça ne devrait plus se reproduire

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

Discussions similaires

  1. Recherche d'une valeur dans une table
    Par alainbd dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/10/2009, 09h09
  2. Réponses: 3
    Dernier message: 21/10/2009, 16h07
  3. [AC-2003] Recherche deux valeurs dans une table
    Par drakkar_agfa dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/09/2009, 16h03
  4. [Toutes versions] Amélioration : Recherche de valeur dans une table
    Par Victor1 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 28/08/2009, 15h21
  5. [VB6]recherche d'une valeur dans une table access
    Par fahmichebaane dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/04/2006, 15h26

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