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 éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 227
    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 624
    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 624
    Billets dans le blog
    10
    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 confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    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.

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 227
    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 confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    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)...

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

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

    Michel

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    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 176
    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 confirmé
    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
    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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    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
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963

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