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 :

Syntaxe auto-jointure dans une vue


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Points : 58
    Points
    58
    Par défaut Syntaxe auto-jointure dans une vue
    Environnement : SQL Server 2000

    Objectif : concevoir une vue présentant en colonnes les lignes d'une table en utilisant une auto-jointure.

    Contexte : une table historique contient des enregistrements marquant un évènement "début" et un évènement "fin". Les enregistrements "début" et "fin" ont la même structure, puisqu'elle sont hébergées dans la même table. La valeur d'une colonne permet de les différencier. Toutes les lignes "début" n'ont pas nécessairement de ligne "fin".

    Structure de la table historique :
    CREATE TABLE [APX_HISTO] (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [objet_type] [int] NOT NULL ,
    [op_type] [int] NOT NULL ,
    [dossier_id] [varchar] (11) NOT NULL ,
    [objet_id] [varchar] (50) NOT NULL ,
    [detail_1] [varchar] (500) NULL ,
    [detail_2] [varchar] (500) NULL ,
    [creation_dt] [datetime] NOT NULL ,
    CONSTRAINT [PK_M1_HISTO] PRIMARY KEY CLUSTERED
    (
    [id]
    ) ON [PRIMARY]
    )

    Données de la table historique : cf. "table_histo.htm" en PJ

    Structure souhaitée de la vue : cf. "vue_histo.htm" en PJ

    Structure actuelle de la vue :

    CREATE VIEW dbo.APX_Changement_Offre_V
    AS
    SELECT A.dossier_id AS CONTRAT,
    A.detail_1 AS OFFRE,
    A.creation_dt AS DEBUT,
    B.creation_dt AS FIN,
    A.objet_id AS INCREMENT
    FROM dbo.APX_HISTO A,
    dbo.APX_HISTO B
    WHERE A.objet_type = 6
    AND A.op_type = 1
    AND (B.objet_type = 6 OR B.objet_type is null)
    AND (B.op_type = 3 OR B.op_type IS NULL)
    AND A.objet_id *= B.objet_id
    AND A.dossier_id *= B.dossier_id

    --> pour un dossier donné, 3 lignes de résultat

    Problème :

    1) la syntaxe utilisée pour la jointure n'est pas conforme à SQL2 et n'est pas pérène,
    2) une fois portée vers une syntaxe LEFT OUTER JOIN, le résultat n'est pas le même qu'avec l'ancienne syntaxe "*=" :
    SELECT A.dossier_id AS CONTRAT,
    A.detail_1 AS OFFRE,
    A.creation_dt AS DEBUT,
    B.creation_dt AS FIN,
    A.objet_id AS INCREMENT
    FROM dbo.APX_HISTO A
    LEFT OUTER JOIN dbo.APX_HISTO B
    ON A.objet_id = B.objet_id
    AND A.dossier_id = B.dossier_id
    WHERE A.objet_type = 6
    AND A.op_type = 1
    AND (B.objet_type = 6 OR B.objet_type is null)
    AND (B.op_type = 3 OR B.op_type IS NULL)

    --> pour un dossier donné, 1 seule ligne de résultat

    Demande : comment utiliser la syntaxe LEFT OUTER JOIN pour obtenir le même résultat qu'avec "*=" ?
    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Je crois que celle-ci doit marcher:

    SELECT A.dossier_id AS CONTRAT,
    A.detail_1 AS OFFRE,
    A.creation_dt AS DEBUT,
    B.creation_dt AS FIN,
    A.objet_id AS INCREMENT
    FROM dbo.APX_HISTO A
    LEFT OUTER JOIN dbo.APX_HISTO B
    ON A.objet_id = B.objet_id
    AND A.dossier_id = B.dossier_id
    AND B.objet_type = 6
    WHERE A.objet_type = 6
    AND A.op_type = 1
    AND (B.op_type = 3 OR B.op_type IS NULL)

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    J'ai oublié un morceau

    Là c'est mieux:
    SELECT A.dossier_id AS CONTRAT,
    A.detail_1 AS OFFRE,
    A.creation_dt AS DEBUT,
    B.creation_dt AS FIN,
    A.objet_id AS INCREMENT
    FROM dbo.APX_HISTO A
    LEFT OUTER JOIN dbo.APX_HISTO B
    ON (A.objet_id = B.objet_id
    AND A.dossier_id = B.dossier_id
    AND B.objet_type = 6
    AND B.op_type = 3)
    WHERE A.objet_type = 6
    AND A.op_type = 1


    A+

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Points : 58
    Points
    58
    Par défaut
    Merci LoveBuff : je suis un peu dégouté de ne pas y avoir pensé, mais l'essentiel est que ça marche !
    Merci encore !

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

Discussions similaires

  1. auto jointure dans une meme colonne
    Par Invité dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/05/2011, 22h57
  2. Création d'un champ "auto-incrémenté" dans une vue
    Par damnn dans le forum Développement
    Réponses: 8
    Dernier message: 20/10/2009, 14h50
  3. Champs virtuel auto incrémenté dans une vue
    Par berceker united dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2006, 14h33
  4. [SQL Server] auto increment dans une vue
    Par pimousse_cerise dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/05/2006, 10h18
  5. [Syntaxe] mettre des ' dans une string ?
    Par souch dans le forum Débuter
    Réponses: 4
    Dernier message: 14/08/2003, 16h26

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