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 :

Insert-values: récupérer la valeur de la fonction DAY()


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut Insert-values: récupérer la valeur de la fonction DAY()
    Bonjour,

    programmeur très occasionnel, je suis confronté à un problème que je suis incapable de résoudre; je vous soumets donc le cas suivant:

    Je transfère une partie des données d'une table "A" vers une table "B".
    dans ma table "A", j'ai un champ défini comme tel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sis_dtblocr date NOT NULL,
    et dans la "B", j'ai les champs définis comme tels:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jjour int(2) UNSIGNED ZEROFILL NOT NULL,
      mmois int(2) UNSIGNED ZEROFILL NOT NULL,
    Pour passer la valeur de mes champs -dont le jour entre autres -dans mon insert, en VALUES de "jjour" je passe le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (select DAY(sis_dtblocr) as jour from sisfc00),
    le résultat, assez logiquement, à l'exécution donne le message suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Base de données format FC créée correctement
     
    Erreur lors du chargement de la base de données FC : Subquery returns more than 1 row
    Existe-t-il un paramètre SQL qui permet au moteur de lier le résultat du DAY() dans le select à l'enregistrement en cours de chargement/enregistrement?

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par A_lexis Voir le message
    Je transfère une partie des données d'une table "A" vers une table "B".
    Ce qui veut dire que c'est un ajout de lignes dans B ?

    Il faut alors faire non pas une requête INSERT ... VALUES qui n'insère qu'une seule ligne mais une requête INSERT ... SELECT qui insère tout ce qu'il y a dans le SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO B(jjour, mmois, ...)
    SELECT DAY(date), MONTH(date)...
    FROM A
    WHERE condition
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut Reformulation de la demande
    Bonjour,

    par rapport à la réponse que j'ai reçue (merci pour la célérité), en effet, j'ai des enregistrements dans ma base "A", je crée la base "B" pour y déverser une sélection de champs, parmi lesquels le fameux champ DATE.

    Je vais potasser la voie du SELECT même si pour le moment je ne vois pas que mettre dans une clause WHERE. J'ai en effet réalisé quelques tests dans phpMyAdmin quand je recherchais cette solution, mais sans succès.

    Peut-être que le code complet sera éclairant: je transmets un certain nombre de champs avec quelques clauses SELECT (pour les champs jjour, mmois, hheure, mminute et poste).

    En l'absence d'une clause WHERE, il n'y a donc pas de pointeur à mettre dans les SELECT pour que le select se réduise à l'enregistrement en cours de traitement?

    Merci par avance, Alexis.

    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
    $insertFC = "insert into fc00 
    (codecomp,
     numvol,
     codecomp2,
     AR,
     codeaero,
     jjour, mmois, hheure, mminute,
     natvol,
     typmvt,
     immat,
     typapp,
     paxtrans,
     poste,
     cesc1, pax1,  fret1,
     cesc2, pax2, fret2,
     cesc3, pax3, fret3,
     cesc4, pax4, fret4,
     cesc5, pax5, fret5)
      VALUES
      ('sis_expl',
       'sis_numvol',
       'sis_affret',
       'sis_mouv',
       'sis_aero',
       (select DAY(sis_dtblocr) as jour from sisfc00),(select MONTH(sis_dtblocr) as jour from sisfc00),
       (select HOUR(sis_hblocr) as heure from sisfc00),(select MINUTE(sis_hblocr) as soixante from sisfc00),
       'sis_class',
       'sis_vol',
       'sis_immat',
       'sis_modele',
       'sis_paxtrans', 
       (select (sis_esc17 + sis_esc27 + sis_esc37 + sis_esc47 + sis_esc57) as poste from sisfc00),
       'sis_esc11', 'sis_esc13', 'sis_esc16',
       'sis_esc21', 'sis_esc23', 'sis_esc26',
       'sis_esc31', 'sis_esc33', 'sis_esc36',
       'sis_esc41', 'sis_esc43', 'sis_esc46',
       'sis_esc51', 'sis_esc53', 'sis_esc56');";

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ceci m'étonne :
    pour le moment je ne vois pas que mettre dans une clause WHERE
    Alors que :
    Je transfère une partie des données d'une table "A" vers une table "B".
    Comment est déterminée cette partie ?
    Il s'agit bien d'un certain nombre de lignes de la table A à insérer dans la table B selon certains critères de sélection non ?

    Vous n'insérez pas qu'une seule ligne ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ceci m'étonne :

    Alors que :

    Comment est déterminée cette partie ?
    Il s'agit bien d'un certain nombre de lignes de la table A à insérer dans la table B selon certains critères de sélection non ?

    Vous n'insérez pas qu'une seule ligne ?
    Pardon, je me suis mal exprimé: en parlant "d'une partie" je voulais dire un certain nombre de colonnes de la table "A" (qui en comporte bien plus que la table de destination) aussi, je n'effectue aucun critère de transfert, je veux tous les enregistrements. Seul le nombre de colonnes ou la valeur de certains champs mis en exergue par la clause SELECT varie entre les deux tables; le nombre final d'enregistrements sera lui le même entre les deux tables.

    Mon problème réside donc dans le fait que je veux éclater le champ DATE de ma table "A" vers deux champs: jjour et mmois de la table "B",
    un champ TIME de la table "A" en deux champs hheure et mminute dans la table B et enfin, je veux additionner plusieurs champs de la table "A" pour les cumuler dans un champ unique de la table "B": 'poste'.

    Tout cela bien évidemment par enregistrement, avec l'erreur que génèrent mes select:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Base de données FC supprimée
     
    ===> Suite du traitement
     
    Base de données format FC créée correctement
     
    Erreur lors du chargement de la base de données FC : Subquery returns more than 1 row
    Je ne vois pas quelle clause WHERE mettre car je crée la table "B" juste avant de la charger: elle est donc vide et créée pour recevoir les colonnes ou parties de colonne de la table "A".

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par A_lexis Voir le message
    Pardon, je me suis mal exprimé: en parlant "d'une partie" je voulais dire un certain nombre de colonnes de la table "A" (qui en comporte bien plus que la table de destination) aussi, je n'effectue aucun critère de transfert, je veux tous les enregistrements. Seul le nombre de colonnes ou la valeur de certains champs mis en exergue par la clause SELECT varie entre les deux tables; le nombre final d'enregistrements sera lui le même entre les deux tables.
    Donc il s'agit bien d'un INSERT... SELECT et non pas d'un INSERT... VALUES !
    Inspire toi de la requête que j'ai donnée tout à l'heure (j'en ai retiré le WHERE puisqu'il est inutile, toutes les lignes de A seront envoyées vers B mais seulement les colonnes sélectionnées) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO B(jjour, mmois, ...)
    SELECT DAY(date), MONTH(date)...
    FROM A
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut
    Je te remercie, je me lance dans la réalisation de la requête ad hoc. Merci encore pour ta célérité... et ta patience.

    Amicalement, Alexis.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut On prend les mêmes..
    J'ai donc modifié la seconde partie de ma requête:

    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
     select
      ('sis_expl',
       'sis_numvol',
       'sis_affret',
       'sis_mouv',
       'sis_aero',
       DAY('sis_dtblocr'),
       MONTH('sis_dtblocr'),
       HOUR('sis_hblocr'),
       MINUTE('sis_hblocr'),
       'sis_class',
       'sis_vol',
       'sis_immat',
       'sis_modele',
       'sis_paxtrans', 
       ('sis_esc17' + 'sis_esc27' + 'sis_esc37' + 'sis_esc47' + 'sis_esc57'),
       'sis_esc11', 'sis_esc13', 'sis_esc16',
       'sis_esc21', 'sis_esc23', 'sis_esc26',
       'sis_esc31', 'sis_esc33', 'sis_esc36',
       'sis_esc41', 'sis_esc43', 'sis_esc46',
       'sis_esc51', 'sis_esc53', 'sis_esc56')
       from sisfc00;
    Et le message ressemble comme à un frère siamois au premier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Base de données FC supprimée
     
    ===> Suite du traitement
     
    Base de données format FC créée correctement
     
    Erreur lors du chargement de la base de données FC : Operand should contain 1 column(s)
    Je continue à rechercher. Des idées?

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je suppose qu'avant ce SELECT il y a l'INSERT ?
    On peut le voir ?

    Ensuite il est inutile de mettre le contenu du SELECT entre parenthèses.

    Enfin, ça m'étonnerait que ceci puisse fonctionner :
    Extraire le jour de la chaîne de caractères 'sis_dtbocr' ?
    Idem pour MONTH et YEAR bien sûr.

    Idem pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('sis_esc17' + 'sis_esc27' + 'sis_esc37' + 'sis_esc47' + 'sis_esc57')
    Additionner des chaînes de caractères ?

    Enfin, tu l'auras peut-être compris, toutes tes chaînes de caractères alimenteront tel quel les colonnes de la table B !
    Si ces chaînes de caractères représentent en fait des noms de colonnes de la table A alors supprime les '.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut En effet...
    Bonjour,

    internet en rade, je découvre la réponse et bien évidemment, après nombre de tâtonnements, c'était bien un problème de protection inutile des champs et du select entre parenthèses.

    Merci donc.

    Amicalement, Alexis.

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

Discussions similaires

  1. Récupérer la valeur d'une fonction Access
    Par Invité dans le forum VBScript
    Réponses: 0
    Dernier message: 09/02/2009, 14h55
  2. Réponses: 4
    Dernier message: 13/06/2007, 23h33
  3. Récupérer les valeurs dans une fonction
    Par matmay dans le forum MATLAB
    Réponses: 3
    Dernier message: 04/05/2007, 17h50
  4. Récupérer une valeur d'une fonction
    Par rimeh dans le forum Langage
    Réponses: 3
    Dernier message: 12/02/2007, 11h21
  5. Réponses: 3
    Dernier message: 23/01/2007, 10h20

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