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 :

Requête insert into + jointures


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut Requête insert into + jointures
    Bonjour,

    Voici le contexte de mon problème :

    Je possède une BDD avec différents films, chacun sont catégorisé ( ex : action, aventure etc...) et une partie de ces films est dans la catégorie divers. J'aimerais pouvoir les changer de catégorie ( je possède déjà l’interface nécessaire en C# il me manque juste la procédure stockée que je n'arrive pas à faire). Je dois pouvoir changer de catégorie un film et le mettre dans plusieurs catégorie à la fois : c'est à dire qu'il ne sera plus présent dans divers, mais présent dans les autres catégories.
    J'avais commencé par une requête UPDATE qui marchait très bien, seulement je n'ai qu'un seul choix de catégorie, l'UPDATE ne modifie qu'une seule valeur. Ex catégorie divers = 0, aventure = 1, action = 2. Si je souhaites mettre mon film dans action le 0 sera remplacé par le 2 et je souhaite ensuite le mettre dans action le 2 sera remplacé par 1.

    Ce je que voudrais faire est une requête de type INSERT INTO en reprenant à chaque fois la même ligne mais en la modifiant à chaque fois au niveau de la catégorie pour que le film soit visible dans action et aventure par exemple.

    Voici ma requête 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
    ALTER PROCEDURE [dbo].[obo_UpdateCategory]
    @ProgramId varchar(20),
    @CategoryId int
    AS
    BEGIN
    	SET NOCOUNT ON;
     
    	UPDATE dbo.SubCategory 
    	SET CategoryId = @CategoryId
    	FROM SubCategory AS sub
    	LEFT JOIN dbo.ProgramCategory AS prog ON sub.Id = prog.SubCategoryId
    	LEFT JOIN dbo.vActiveContent AS vac ON vac.Id = prog.ProgramId
    	WHERE ProgramId = @ProgramId
    END
    Je passe par trois tables différentes pour faire le lien entre les données. D'après ce que j'ai vu sur la documentation du site il existe une requête de type INSERT INTO... SELECT... pour copier d'un table à une autre, est-il possible de l'utiliser dans mon cas en changeant uniquement la valeur de catégorie à chaque fois ? Coté C# la requête peut être appelée plusieurs fois, avec une boucle for each ce n'est pas le soucis.

    Merci par avance

    Julien

    PS: j'espère avoir été clair dans l'expression de mon problème, demandez-moi si vous voulez d'autres précisions.

  2. #2
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Voici un nouveau code qui est plus proche de ce que je veux faire, malheureusement il y a un problème au niveau de INSERT, ma table ne contient que 3 colonnes et j'en met 6 ! Peut-être faut-il que je passe par une table temporaire ?

    Voici le code :

    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
    ALTER PROCEDURE [dbo].[obo_UpdateCategory]
    @ProgramId varchar(20),
    @CategoryId int
    AS
    BEGIN
    	SET NOCOUNT ON;
     
    	INSERT dbo.Subcategory 
    	([Id]
    	,[Label]
    	,[CategoryId]
    	,[ProgramId] --ne fait pas partie de dbo.Subcategory
    	,[SubCategoryId]--ne fait pas partie de dbo.Subcategory
    	,[ProgramType])--ne fait pas partie de dbo.Subcategory
    	SELECT sb.Id,
    	sb.Label,
    	@CategoryId,
    	pc.programId,
    	pc.subcategoryid,
    	pc.programType
    	FROM
    	dbo.Subcategory sb left join ProgramCategory pc
    	ON sb.Id = pc.Subcategoryid
    	WHERE ProgramId = @ProgramId
     
    END
    Mes modifications sont appliquées que sur dbo.subcategory, je ne fais que changer "CategoryID" ou j'en mets plusieurs pour un seul Id. L'id correspond à subcategoryif de l'autre table, dont j'ai besoin pour la donnée programId.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre problème est incompréhensible... pourquoi diable essayez vous de mettre six colonnes dans une table qui en contient trois ?

    Donnez nous la définition de vos tables, et expliquez clairement ce que vous voulez faire, sans ça, on ne pourra pas vous aider...

    qu'entendez-vous par
    je ne fais que changer "CategoryID" ou j'en mets plusieurs pour un seul Id
    Avec la définition de vos tables, ajoutez un exemple de contenu (avant et après l'opération que vous tentez de réaliser), ça pourra également aider à comprendre le problème

  4. #4
    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
    Personnellement, avec le peu d'infos qu'on a, j'ai peur du défaut de modélisation où la table de jointure nécessaire entre les catégories et les films serait absente.

    J'espère me tromper.

    On en saura plus lorsqu'on aura le DDL des tables concernées.
    Kropernic

  5. #5
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Bonjour,

    Voici ma requête au final, j'ai compris ce que je tentais de faire était infaisable et je suis resté sur deux tables à la place de trois.


    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
    ALTER PROCEDURE [dbo].[obo_UpdateCategory]
    @ProgramId varchar(20),
    @SubCategoryId int
    AS 
    BEGIN
    	SET NOCOUNT ON;
     
    INSERT INTO dbo.ProgramCategory
    ([ProgramId]
    ,[SubcategoryId]
    ,[ProgramType]
    ,[UpdateNc])
    SELECT ProgramId,@SubCategoryId,ProgramType,'1'
    FROM ProgramCategory
    WHERE ProgramId = @ProgramId
     
    END

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bah...

    Sur ce coup, je n'aurai compris ni le problème, ni la solution !

    Enfin, content quand même que vous en ayez trouvé une...

  7. #7
    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
    Citation Envoyé par aieeeuuuuu Voir le message
    Bah...

    Sur ce coup, je n'aurai compris ni le problème, ni la solution !
    Nous sommes deux !
    Kropernic

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

Discussions similaires

  1. la requête INSERT INTO. . . SELECT
    Par asma_tn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/09/2007, 17h01
  2. Procédure Form_Open,problème de requête Insert into
    Par Averroes dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/08/2007, 21h49
  3. Pb requète INSERT INTO
    Par yannick9 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 14/08/2007, 10h37
  4. Requête INSERT INTO SELECT
    Par unix27 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/02/2007, 00h36
  5. Réponses: 3
    Dernier message: 05/03/2006, 23h38

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