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 :

Select avec sous requête


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut Select avec sous requête
    Bonjour à tous,

    J'ai une requête qui me fait m'arracher le peu de cheveux qui me restent....
    L'environnement est simplissime.

    J'ai deux tables Artiste et Oeuvre. Le lien entre les deux tables est le code article.

    Ma requête est la suivante :

    Je dois afficher toutes les oeuvres des artistes encore vivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.nom FROM artiste a
    WHERE a.codArticle IN (SELECT o.codArticle FROM oeuvre o) 
    AND a.pays='FRANCE' AND a.dateDécès IS NULL;
    La requête fonctionne très bien. Mon problème c'est que je dois afficher des info qui sont dans la table Oeuvre, comme le titre de l'oeuvre... etc...
    Et comme le Select de la table Oeuvre est dans la sous requête, je n'ai pas accès à ses attributs.

    Je sais que j'aurais pu faire autrement en faisant une jointure sur les deux tables, et là j'aurais pu tout avoir... Mais c'est le but de mon exercice.
    J'ai déjà effectué une version de cette requête, et elle marche très bien. Je dois faire la même requête avec des sous requête (IN ou NOT IN).

    Si vous avez une idée, ce serait génial.

    Merci d'avance

    Michel

  2. #2
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Vous pouvez faire une jointure avec une table dérivée (c'est faire compliqué quand on peut faire simple, mais si c'est le but de l'exercice...)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT a.nom 
         , s.tit
         , s.dtp
    FROM artiste a
    inner join
         (select o.codArticle    as art
               , o.titre         as tit
               , o.date_parution as dtp
          from oeuvre) as s
       on s.art=a.codArticle
    WHERE a.pays='FRANCE' 
      AND a.dateDécès IS NULL

  3. #3
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Michel38 Voir le message
    Je sais que j'aurais pu faire autrement en faisant une jointure sur les deux tables, et là j'aurais pu tout avoir... Mais c'est le but de mon exercice.
    J'ai vraiment du mal à voir l’intérêt de ce genre d'exercice: faire une jointure sans jointure.
    Courage.

    Bon, mais en fait, "toutes les oeuvres des artistes encore vivants" c'est un select ... from oeuvres where article in (select from artiste where ... vivant ...), non ? On ne demande pas le nom des artistes.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  4. #4
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Bonjour, et merci pour vos réponse.

    Les questions sont les suivantes :

    Liste des oeuvres des artistes vivants nés en France
    Afficher tous les artistes même ceux qui n’ont pas d’oeuvre. Tri par ordre alphabétique.
    Proposer deux méthodes différentes : Jointure Externe et NVL puis Opérateur
    ensembliste (UNION et NOT IN)
    Afficher : Artiste Sexe Localité OEuvre Année Création
    Donc, la première méthode qui utilise les jointures externes, j'ai fait.
    Pour la deuxième méthode, j'ai deux requêtes quasi identiques pour utiliser un UNION entre les artistes qui ont des oeuvres, et les artistes qui n'en ont pas.
    Et donc le problème est que je dois afficher des attributs des deux tables.

    Michel

  5. #5
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Dans le temps, certains SGBD n'avaient pas de jointures externes et donc on faisait une jointure, et on rajoutait (union all) les lignes sans correspondances (not in)...
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  6. #6
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Merci pour vos réponses. Je vais étudier ça.

    Michel

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Tu ne précises pas ta version d'Oracle mais depuis la 12.1 tu peux utiliser la clause LATERAL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT a.nom, o.titre FROM artiste a
    LATERAL (select o.titre from oeuvre o where o.codArticle = a.codarticle) o
    WHERE a.pays='FRANCE' AND a.dateDécès IS NULL;

  8. #8
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2014
    Messages : 34
    Points : 179
    Points
    179
    Par défaut
    Bonjour à tous,

    Et avec un "INNER JOIN" (ou "JOIN") pour faire la jointure, cela n'est pas possible ?

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Depuis la version 12c, vous pouvez utiliser CROSS APPLY ou OUTER APPLY selon votre besoin, plutôt que LATERAL qui est incomplet...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358

Discussions similaires

  1. Insert multiples avec sous-requête SELECT
    Par lolymeupy dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/08/2011, 17h57
  2. Select avec sous-requête
    Par Kentin64 dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/06/2011, 11h10
  3. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  4. DELETE avec sous-requête
    Par say dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2005, 08h20
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

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