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

Développement SQL Server Discussion :

Besoin d'aide pour une requête (récursivité ?)


Sujet :

Développement SQL Server

  1. #21
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Les tabulations sont interprétées très généreusement par la balise code, pour lever le doute je les remplace par des espaces avant de coller le code.

  2. #22
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    quelqu'un pourrait m'aider à comprendre la requête ?

    j'ai vraiment du mal. d'autant que l'opérateur apply est nouveau pour moi et les articles le concernant ne me semble pas super clair.
    Kropernic

  3. #23
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Je n'arrive pas à comprendre pourquoi on fait la comparaison suivante dans la table T
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CRD2.CRD_SERIAL > CRD.CRD_SERIAL
    Je pense avoir compris l'opérateur APPLY (après une dizaine d'articles, ce n'est pas trop tôt) mais cette inégalité, elle m'échappe totalement.

    Je ne remets pas en doute son utilité (d'ailleurs sans elle la query ne marche bien sûr pas) mais je ne la comprends juste pas.

    Si une bonne âme pouvait éclairer ma lanterne...

    ++
    Kropernic

  4. #24
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Pour chaque ligne de la table, je récupère la première rupture supérieur (d'où le >).
    Je n'ai ensuite plus qu'a faire un MIN et un MAX par valeur de rupture
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #25
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    pour mieux comprendre vous pouvez ajouter dans le SELECT la colonne , T.CRD_SERIAL...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  6. #26
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je ne remets pas en doute son utilité (d'ailleurs sans elle la query ne marche bien sûr pas) mais je ne la comprends juste pas.
    Il y a bien sûr moyen de se passer du OUTER APPLY...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  7. #27
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    OUTER APPLY me convient très bien

    Pour ce qui est de la manière de procéder en français (en se détachant de ce qui est sql), j'ai bien compris ce que vous faisiez.

    Mais j'ai toujours des problèmes pour comprendre quelle partie du code fait quoi.

    Avec vos deux derniers messages, je comprends maintenant que la table de droite du OUTER APPLY sert à trouver les ruptures (le reste étant évident).
    Par contre, je ne comprends toujours pas comment il fait... Je crois que quelque chose dans cet opérateur m'échappe...

    Prend-il déjà en compte le filtre se trouvant dans la clause WHERE de la requête "principale" ?



    En fait, j'essaie maintenant de reproduire le même genre de requête mais pour obtenir ce qui est disponible en stock. Mais jusque là, je fais chou blanc car je ne comprends pas comment obtenir la rupture justement.

    J'arrive sans souci à avoir la liste des cartes qui sont présente. Ensuite j'applique les fonctions d’agrégation min et max. Il me manque la rupture...
    Je bidouille des trucs mais vu que je ne comprends pas vraiment ce que je fais, je fais de la merde... Ce sont les mêmes tables qui entrent en jeu (sauf qu'on se moque des commandes maintenant). Seule table supplémentaire, celle qui stock la date de sortie du stock de l'entrepôt.

    Sans me donner la requête complète (je tiens à comprendre et y arriver par moi-même), pourriez-vous me mettre sur la voie ?

    Voici le DDL de cette table supplémentaire ainsi que celui de la vue que j'utilise pour ne pas devoir constamment utiliser 2 tables pour le stock.
    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
    USE [GIFT_MANAGEMENT]
    GO
     
    /****** Object:  Table [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS]    Script Date: 10/23/2012 10:19:02 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TABLE [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS](
        [GFT_ID] [int] NOT NULL,
        [ESE_ID] [tinyint] NOT NULL,
        [ESS_DATE_OUT] [datetime] NOT NULL,
     CONSTRAINT [PK_T_ENTREPOT_STOCK_SORTIE_ESS] PRIMARY KEY CLUSTERED 
    (
        [GFT_ID] ASC,
        [ESE_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
     CONSTRAINT [AK_T_ENTREPOT_STOCK_SORTIE_ESS] UNIQUE NONCLUSTERED 
    (
        [GFT_ID] ASC,
        [ESS_DATE_OUT] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS]  WITH CHECK ADD  CONSTRAINT [FK_T_ENTREPOT_STOCK_SORTIE_ESS_T_ENTREPOT_STOCK_ENTREE_ESE] FOREIGN KEY([GFT_ID], [ESE_ID])
    REFERENCES [dbo].[T_ENTREPOT_STOCK_ENTREE_ESE] ([GFT_ID], [ESE_ID])
    ON DELETE CASCADE
    GO
     
    ALTER TABLE [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS] CHECK CONSTRAINT [FK_T_ENTREPOT_STOCK_SORTIE_ESS_T_ENTREPOT_STOCK_ENTREE_ESE]
    GO
    ------------------------------------------
    USE [GIFT_MANAGEMENT]
    GO
     
    /****** Object:  View [dbo].[V_ENTREPOT_STOCK_VES]    Script Date: 10/23/2012 10:19:29 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE VIEW [dbo].[V_ENTREPOT_STOCK_VES] WITH SCHEMABINDING
    AS
    SELECT
            ESE.GFT_ID,
            ESE.ESE_ID,
            ESE.ESE_DATE_IN,
            ESS.ESS_DATE_OUT
    FROM
            DBO.T_ENTREPOT_STOCK_ENTREE_ESE ESE
                LEFT JOIN DBO.T_ENTREPOT_STOCK_SORTIE_ESS ESS
                    ON    ESE.GFT_ID = ESS.GFT_ID
                    AND    ESE.ESE_ID = ESS.ESE_ID
     
    GO
    Voici en gros, ce que je pense qu'il faut 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
     
    SELECT
            CRD.CRD_PREFIX,
            CRD.CRD_TYPE,
            MIN(CRD.CRD_SERIAL) AS 'MIN',
            MAX(CRD.CRD_SERIAL) AS 'MAX'
    FROM
            V_ENTREPOT_STOCK_VES VES
                INNER JOIN T_CARD_CRD CRD
                    ON  VES.GFT_ID = CRD.GFT_ID
    WHERE
            NOT VES.ESS_DATE_OUT IS NULL
    GROUP BY
            CRD.CRD_PREFIX,
            CRD.CRD_TYPE
    Je pense qu'il manque donc juste l'usage de l'opérateur APPLY mais je ne vois pas comment l'utiliser...
    Kropernic

  8. #28
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bon, j'y suis arrivé mais plus par bol et mimétisme que par compréhension je pense.

    Voici la requête :
    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
     
    SELECT
            CRD.CRD_PREFIX,
            CRD.TCA_ID,
            T.CRD_SERIAL,
            MIN(CRD.CRD_SERIAL) AS 'MIN',
            MAX(CRD.CRD_SERIAL) AS 'MAX'
    FROM
            dbo.V_ENTREPOT_STOCK_VES VES
                INNER JOIN    T_CARD_CRD CRD
                    ON    VES.GFT_ID = CRD.GFT_ID 
                OUTER APPLY    (
                            SELECT
                                    MIN(CRD_SERIAL) AS 'CRD_SERIAL'
                            FROM
                                    dbo.V_ENTREPOT_STOCK_VES VES2
                                        INNER JOIN T_CARD_CRD CRD2
                                            ON    VES2.GFT_ID = CRD2.GFT_ID 
                            WHERE
                                    NOT VES2.ESS_DATE_OUT IS NULL
                                AND    CRD.TCA_ID = CRD2.TCA_ID 
                                AND    CRD2.CRD_SERIAL > CRD.CRD_SERIAL 
                            ) T
    WHERE
            CRD.TCA_ID = 9
        AND    VES.ESS_DATE_OUT IS NULL
    GROUP BY
            CRD.CRD_PREFIX,
            CRD.TCA_ID,
            T.CRD_SERIAL
    ORDER BY
            CRD.CRD_PREFIX,
            CRD.TCA_ID,
            [MIN]
    N.B. : J'ai externalisé la colonne CRD_TYPE dans une table des types de cartes. Ce qui donne la colonne clef étrangère TCA_ID de type smallint.


    Des commentaires ?
    Kropernic

  9. #29
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Je passe la discussion en Résolu mais je reviendrai probablement vous ennuyer avec d'autres questions à ce sujet.
    Kropernic

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Besoin d'aide pour une requête de MAJ (modif. de car.)
    Par ptitscrat dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 17h27
  2. besoin d'aide pour une requête
    Par lipao17 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/01/2006, 16h55
  3. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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