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 :

Quelle est la syntaxe SQL Oracle équivalente?


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut Quelle est la syntaxe SQL Oracle équivalente?
    Bonjour,
    J'ai travaillé sur SQL Server et j'ai quelques questions sur la syntaxe Oracle.

    J'aimerais connaître comment on peut écrire ces requetes pour Oracle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE
    FROM CATALOGUE 
    WHERE REF IN (SELECT REF FROM REF_NON_DISPO)
     
    DELETE t1
    FROM CATALOGUE t1
    INNER JOIN REF_NON_DISPO t2
    	ON t1.REF = t2.REF
    Ici, sur SQL server les 2 requêtes sont équivalentes, mais ce qui m'intéresse c'est la deuxième requête avec INNER JOIN (imaginons que la clé est sur plusieurs colonnes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE t1
    SET t1.PRIX = t2.PRIX
    FROM CATALOGUE t1
    INNER JOIN NOUVEAUX_PRIX t2
    	ON t1.REF = t2.REF
    Là - pareil, y a-t-il moyen de faire un UPDATE avec un INNER JOIN?

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je ne pense que pas qu'Oracle peut faire ce type d'UPDATE avec un INNER JOIN dans la clause FROM car cette syntaxe n'est pas possible avec Oracle
    (pas de clause FROM dans UPDATE: http://download.oracle.com/docs/cd/B...7.htm#i2067715).

    Mais on peut faire:

    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
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
     
    SQL>
    SQL> drop table catalogue purge;
     
    Table dropped.
     
    SQL> drop table nouveaux_prix purge;
     
    Table dropped.
     
    SQL>
    SQL> create table catalogue (ref int primary key, prix int);
     
    Table created.
     
    SQL> create table nouveaux_prix (ref int primary key, prix int);
     
    Table created.
     
    SQL>
    SQL> insert into catalogue values(1,10);
     
    1 row created.
     
    SQL> insert into catalogue values(2,20);
     
    1 row created.
     
    SQL> insert into nouveaux_prix values(1,20);
     
    1 row created.
     
    SQL> insert into nouveaux_prix values (2,40);
     
    1 row created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL>
    SQL> select * from catalogue;
     
           REF       PRIX
    ---------- ----------
             1         10
             2         20
     
    SQL> select * from nouveaux_prix;
     
           REF       PRIX
    ---------- ----------
             1         20
             2         40
     
    SQL>
    SQL> update catalogue t1
      2  set t1.prix = (select t2.prix from nouveaux_prix t2 where t1.ref = t2.ref);
     
     
    2 rows updated.
     
    SQL>
    SQL>
    SQL> select * from catalogue;
     
           REF       PRIX
    ---------- ----------
             1         20
             2         40
     
    SQL>

  3. #3
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Cette syntaxe est disponible à partir de Oracle 7.3 il me semble.
    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
     
    SQL> Update (
      2     Select t1.prix, t2.prix prix_nouveau
      3       From catalogue t1
      4            Join
      5            nouveaux_prix t2
      6        On (t1.ref = t2.ref)
      7         )
      8    Set prix = prix_nouveau
      9  /
     
    2 rows updated
     
    SQL> select * from catalogue;
     
                                        REF                                    PRIX
    --------------------------------------- ---------------------------------------
                                          1                                      20
                                          2                                      40

  4. #4
    Membre averti Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Points : 303
    Points
    303
    Par défaut
    à mon avis c'est plus simple d'utiliser le sql oracle.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par pifor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     update catalogue t1
    set t1.prix = (select t2.prix from nouveaux_prix t2 where t1.ref = t2.ref);
    Ca marche, mais je pense que si on veut mettre plusieurs lignes dans la table catalogue (par ex. prix et prix_de_gros), dans ce cas là on est obligé de faire plusieurs SELECTs.


    Et pour le DELETE? Y-a moyen de faire un DELETE avec INNER JOIN?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Ca marche, mais je pense que si on veut mettre plusieurs lignes dans la table catalogue (par ex. prix et prix_de_gros), dans ce cas là on est obligé de faire plusieurs SELECTs
    Non, cette syntaxe fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE catalogue t1
    SET (t1.prix1, t1.prix2) = (SELECT t2.prix1, t2.prix2 FROM nouveaux_prix t2 WHERE t1.ref = t2.ref);
    Au moins sur la 10g, par contre je ne saurai pas dire depuis quelle version.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Non, cette syntaxe fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE catalogue t1
    SET (t1.prix1, t1.prix2) = (SELECT t2.prix1, t2.prix2 FROM nouveaux_prix t2 WHERE t1.ref = t2.ref);
    Au moins sur la 10g, par contre je ne saurai pas dire depuis quelle version.

    Ok, merci. J'utilise la version 10.

    Sinon pour le DELETE est ce que qqun sait s'il y a moyen de faire un INNER JOIN.
    Par exemple, sous SQL Server j'écrirai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE t1
    FROM CATALOGUE t1
    INNER JOIN REF_NON_DISPO t2
    	ON	t1.ID_Fournisseur = t2.ID_Fournisseur
    	AND	t1.REF = t2.REF
    Si par exemple la clé primaire est composée ou si l'on veut faire la jointure sur plusieurs colonnes, on ne peux pas utiliser WHERE ... IN

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    C'est pareil que pour l'update
    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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.5.0 
    Connected as mni
     
    SQL> 
    SQL> Delete (
      2       SELECT t1.prix, t2.prix prix_nouveau
      3         FROM catalogue t1
      4              JOIN
      5              nouveaux_prix t2
      6          ON (t1.ref = t2.ref)
      7           )
      8  /
     
    2 rows deleted
    SQL> Select * from catalogue
      2  /
     
                                        REF                                    PRIX
    --------------------------------------- ---------------------------------------
     
    SQL>

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est pareil que pour l'update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       Delete (
           SELECT t1.prix, t2.prix prix_nouveau
             FROM catalogue t1
                  JOIN
                  nouveaux_prix t2
              ON (t1.ref = t2.ref)
               )
      /
    Ok, c'est bon, ça marche. Je craignais que t2 soit également effacé.

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

Discussions similaires

  1. Quelle est cette syntaxe ?
    Par Sylva1n dans le forum Débuter
    Réponses: 3
    Dernier message: 13/12/2012, 19h57
  2. Quelle est la requete SQL
    Par oami89 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 25/02/2011, 15h43
  3. Quelle est la requete SQL
    Par oami89 dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/02/2011, 17h02
  4. Quelle est la syntaxe précise pour une foreign key ?
    Par vinze60 dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/09/2009, 09h45
  5. Quelle est la syntaxe la plus académique ?
    Par olivepao dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2008, 15h03

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