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

SQL Oracle Discussion :

Order by dans un Insert into


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut Order by dans un Insert into
    Bonjour, je copie/colle mon message issu d'une autre ancienne discussion que je voulais relancer, mes étant donné le fait qu'elle se situe dans un forum POSTGRESQL et que moi j'utilise oracle ... je me permet de poser la question ici :

    Citation Envoyé par Arvulis Voir le message
    Sinon tu peux créer une vue intermediaire avec cet ordre et ensuite faire un insert select de la vue.
    Bonjour, désolé de remonter cet ancien topic, mais la réponse me paraît finalement incomplète.

    j'aimerais créer une table à partir de plusieurs autres tables sans y copier les données des tables, puis ajouter les données des dites tables ordonnées selon une colonne.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table agentsinfotarget
    as
    (select code_name, information_id, gleaned_date, t.first_name,t.last_name, l.description
    from agents a 
                inner join information i 
    on a.agent_id= i.agent_id
                inner join targets t
                on i.target_id=t.target_id
                inner join locations l
                on t.location_id=l.location_id
     where 1=2           )
    Etant donné que les colonnes sont vides, les inner joins ne sont pas utiles mais c'est juste pour la démarche intellectuelle ...

    Ensuite pour ajouter les données dans ma nouvelle table :

    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
    --Insert all data from the appropriate tables. Data should be ordered by CODE_NAME in reverse alphabetical orde
    Insert into agentsinfotarget
    (code_name, information_id, gleaned_date, first_name, last_name, description)
    select code_name, information_id, gleaned_date,first_name,last_name, description
    from 
        (select code_name, information_id, gleaned_date, t.first_name,t.last_name, l.description 
                from   agents a 
                        inner join information i 
                        on a.agent_id= i.agent_id
                        inner join targets t
                        on i.target_id=t.target_id
                        inner join locations l
                        on t.location_id=l.location_id
                        order by code_name desc
          )
    Cependant ensuite, en checkant avec un select * from agentsinfotarget, je vois que les données n'ont pas été ajoutées de façon ordonnées ...

    Ferais-je une erreur où es-ce impossible de spécifier un ordre d'ajout?

    Merci d'avance.

    F.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vos données sont probablement classées dans votre table.

    Mais le select sans indication précise vous renvoie les données tel qu'il le souhaite, et vous ne pouvez pas lui en vouloir.

  3. #3
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    ca donne quoi si

    vous faites
    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
     
    INSERT INTO agentsinfotarget
    (code_name, information_id, gleaned_date, first_name, last_name, description)
    SELECT code_name, information_id, gleaned_date,first_name,last_name, description
    FROM 
        (SELECT code_name, information_id, gleaned_date, t.first_name,t.last_name, l.description 
                FROM   agents a 
                        INNER JOIN information i 
                        ON a.agent_id= i.agent_id
                        INNER JOIN targets t
                        ON i.target_id=t.target_id
                        INNER JOIN locations l
                        ON t.location_id=l.location_id
                        ORDER BY code_name DESC
          )
    order by code_name;

  4. #4
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vos données sont probablement classées dans votre table.

    Mais le select sans indication précise vous renvoie les données tel qu'il le souhaite, et vous ne pouvez pas lui en vouloir.
    Bonjour, je crains fort que non. Etant sur oracle je peux voir la table sans utiliser de select. Et elle n'est pas dans l'ordre attendu.

    fatsora, merci pour la suggestion, j'ai déjà essayer ainsi et cela ne donne pas plus de résultat.


    Cela est embêtant, car après je dois rajouter dans cette table une colonne et lui donner des valeurs incrémenté de 1 à X. Ou 1 doit être associé à la bonne valeur de code_name (en ayant fait l'order by au départ) sans y spécifier quoi que ce soit ...

    F

  5. #5
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    en faite je voulais ecrire
    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
     
     
    INSERT INTO agentsinfotarget
    (code_name, information_id, gleaned_date, first_name, last_name, description)
    SELECT code_name, information_id, gleaned_date,first_name,last_name, description
    FROM
    (SELECT code_name, information_id, gleaned_date, t.first_name,t.last_name, l.description
    FROM agents a
    INNER JOIN information i
    ON a.agent_id= i.agent_id
    INNER JOIN targets t
    ON i.target_id=t.target_id
    INNER JOIN locations l
    ON t.location_id=l.location_id
    ORDER BY code_name DESC
    )
    order by code_name DESC;
    est ce que avec desc c'est pas ordonné

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    C'est un faux problème! Un select sans order by n’implique aucune tri. L’ordre d’insertion des enregistrement n’a aucune importance et la théorie des basses relationnelles demande que c’est comme ça ! En passant il faut noter que l’opérateur ORDER BY n’est pas un opérateur relationnel !

  7. #7
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est un faux problème! Un select sans order by n’implique aucune tri. L’ordre d’insertion des enregistrement n’a aucune importance et la théorie des basses relationnelles demande que c’est comme ça ! En passant il faut noter que l’opérateur ORDER BY n’est pas un opérateur relationnel !
    Peut être, n'empêche que j'ai besoin de le faire.

    fatsora, non cela ne fonctionne pas avec ta méthode.

    J'ai trouvé comment faire :

    Dans on insère les données dans la table, sans spécifier d'order by puisque de toute manière cela n'a aucun effet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     INSERT INTO agentsinfotarget
    (code_name, information_id, gleaned_date, first_name, last_name, description)
    SELECT code_name, information_id, gleaned_date,first_name,last_name, description
    FROM 
        (SELECT code_name, information_id, gleaned_date, t.first_name,t.last_name, l.description 
                FROM   agents a 
                        INNER JOIN information i 
                        ON a.agent_id= i.agent_id
                        INNER JOIN targets t
                        ON i.target_id=t.target_id
                        INNER JOIN locations l
                        ON t.location_id=l.location_id              
          )
    Puis on crée un INDEX sur la colonne que l'on souhaite ordonné dans la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create index codename
    on agentsinfotarget (code_name desc)
    Voila, ça fonctionne .

    F

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Comme Mnitu, je pense que vous n'avez pas vraiment compris, enfin si vous avez ce que vous désirez tant mieux.

    Sachez que même si vous êtes sous Oracle via je ne sais quel outil, quand vous regardez une table cet outil construit un select que vous ne voyez pas.

  9. #9
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut
    Rebonjour,

    Non, cela fonctionne,
    étant donné qu'en suite je crée une nouvelle colonne, cette colonne doit prendre les valeurs de 1 à X.
    1 étant réservé au code_name le plus proche de Z et ainsi de suite.

    Je crée donc une séquence réservé à cette nouvelle colonne qui va commencé à 1 avec un pas de 1.

    Puis j'update cette colonne en lui précisant qu'elle prendra la valeur de sequence.nextval

    Et là dans ma table, les données correspondent bien, le code_name le plus proche de Z a bien sa nouvelle colonne à un et ainsi de suite.

    Sans l'index, cela ne fonctionné pas sans spécifié des conditions d'update, chose que l'on ne doit pas faire pour réussir l'exercice.

    Sinon, je vous invite à m'expliquer pourquoi ce que je viens de faire n'est vrai qu'en apparence.

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par fardon57 Voir le message
    ...
    Sinon, je vous invite à m'expliquer pourquoi ce que je viens de faire n'est vrai qu'en apparence.
    C. J. Date, Database in depth
    Next, the tuples of a relation are unordered, top to bottom. This property follows because,
    again, a body is a set, and sets in mathematics have no ordering to their elements. (Thus,
    for example, {a,b,c} and {c,a,b} are the same set in mathematics, and the same kind of thing
    is naturally true in the relational model.) Of course, when we draw a relation as a table on
    paper, we do have to show the rows in some top-to-bottom order, but that ordering
    doesn’t correspond to anything relational. In the case of the suppliers relation of
    Figure 1-3, for example, I could have shown the rows in any order—say, supplier S3, then
    S1, then S5, then S4, then S2—and the picture would still represent the same relation.
    NOTE
    The fact that the tuples of a relation are unordered doesn’t mean queries
    can’t include an ORDER BY specification, but it does mean that such
    queries produce a result that’s not a relation. ORDER BY is useful for the
    purpose of displaying results, but it isn’t a relational operator as such.
    In similar fashion, the attributes of a relation are also unordered, left to right, because a
    heading too is a mathematical set. Again, when we draw a relation as a table on paper,
    we have to show the columns in some left-to-right order, but that ordering doesn’t
    correspond to anything relational. In the case of the suppliers relation of Figure 1-3, for
    example, I could have shown the columns in any left-to-right order—say STATUS,
    SNAME, CITY, SNO—and the picture would still represent the same relation in the
    relational model. Incidentally, SQL fails here too: SQL tables do have a left-to-right
    ordering to their columns (another reason why SQL tables aren’t relations, in general).
    For example, the pictures below represent the same relation, but two different SQL tables:

Discussions similaires

  1. LIMIT dans un INSERT INTO
    Par Invité dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/10/2007, 10h31
  2. Valeur Null dans un Insert into
    Par jmde dans le forum VBA Access
    Réponses: 12
    Dernier message: 24/09/2007, 09h46
  3. Réponses: 3
    Dernier message: 24/04/2007, 11h06
  4. probleme dans un INSERT INTO...........SELECT
    Par briiice dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/01/2006, 15h13
  5. Multiplier les And dans Sql Insert Into
    Par samlepiratepaddy dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 23/09/2005, 21h55

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