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 :

Comment ajouter une tabledans le 1er select ?


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 70
    Points
    70
    Par défaut Comment ajouter une tabledans le 1er select ?
    Bonjour, je souhaite ajouter un champ nommé X dans le premier select, mais ce champ provient d'une table qui se trouve dans le select imbriqué (table alias SM). voilà le code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT T1.NomPrenom, Activites.Activite, Activites.NumeroActivite FROM Travailleurs T1 INNER JOIN Activites ON T1.NumeroActivite = Activites.NumeroActivite
    WHERE (NOT EXISTS
    (SELECT SM.NumeroTravailleur
    FROM SituationsMensuelles AS SM INNER JOIN
    Travailleurs ON SM.NumeroTravailleur = T1.Numero
    WHERE (Annee = 2009 AND Mois = 1)) AND T1.Quitter = 0)
    Le début du code souhaité du 1er select sera (avec le champ SM.x):
    SELECT T1.NomPrenom, Activites.Activite, SM.x, ...

    Merci pour un conseil.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous pouviez écrire une jointure aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT EMPLOYE.NomPrenom,
    		Activites.Activite,
    		Activites.NumeroActivite,
    		SM.autresColonnes
    FROM dbo.Travailleurs AS EMPLOYE
    INNER JOIN dbo.Activites ON EMPLOYE.NumeroActivite = Activites.NumeroActivite
    INNER JOIN dbo.SituationsMensuelles SM ON EMPLOYE.Numero = SM.NumeroTravailleur
    WHERE EMPLOYE.Quitter = 0
    AND SM.Annee < 2009
    AND SM.Mois < 1
    Votre code comprend une jointure triangulaire : vous voulez faire référence à une requête en dehors d'elle-même, donc pour chaque ligne de la requête englobante, le moteur de base de données va refaire toute une lecture de la table, ce qui équivaut presque à un curseur.
    Vous pouvez regarder sur mon blog pourquoi c'est contre-performant.

    Essayez quand cela est possible de ne pas utiliser des prédicats négatifs, comme NOT EXISTS : cela oblige à lire toute une table, car le moteur de base de données sait ce qui est dans les tables, mais il ne sait pas ce qui n'y est pas. Vous pouvez regarder aussi sur mon blog les clauses à éviter.

    @++

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 70
    Points
    70
    Par défaut
    Bonsoir,
    Merci pour votre intervention,
    Mon problème est assez complexe :
    J'ai la table des employés et la la table de pointages journaliers.
    Uniquement l'employé pointé a un enregistrement dans la table de pointages.

    Je dois lister les employés qui n'ont pas encore pointés, c'est pour cette raison j'ai proposée la requête avec NOT EXISTS

    Est-ce qu'il y a un autre code possible ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Tout dépend de la structure de vos tables, que vous ne donnez pas ...
    Difficile de vous aider sans cela !

    Un exemple cependant :

    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
    CREATE TABLE TbEmploye
    (
    	IDEmploye INT IDENTITY CONSTRAINT PK_TbEmploye PRIMARY KEY,
    	NomEmploye VARCHAR(20),
    	PrenomEmploye VARCHAR(20)
    )
    GO
     
    CREATE TABLE TbPointages
    (
    	IDEmploye INT CONSTRAINT FK_TbPointages_IDEmploye FOREIGN KEY (IDEmploye) REFERENCES TbEmploye,
    	DatePointage DATETIME NOT NULL CONSTRAINT DF_TbPointages_DatePointage DEFAULT (GETDATE())
    )
    GO
     
    -- Création de deux employés
    INSERT INTO TbEmploye (NomEmploye, PrenomEmploye) VALUES ('67', 'Tonton')
    INSERT INTO TbEmploye (NomEmploye, PrenomEmploye) VALUES ('Suket', 'El')
    GO
     
    -- Seul Tonton67 a pointé aujourd'hui
    INSERT INTO TbPointages (IDEmploye) VALUES (1)
    GO
     
    -- Votre requête devient :
    SELECT  E.PrenomEmploye + E.NomEmploye
    FROM dbo.TbEmploye E
    JOIN dbo.TbPointages P ON P.IDEmploye = E.IDEmploye
    Postez votre DDL et écrivez en français uniquement ce que vous voulez avoir.

    @++

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 73
    Points : 70
    Points
    70
    Par défaut
    Bonjour,
    Voilà les 3 tables que je dois traiter :
    1-La table des employés (EMP) : (EmpID int identity primary key, NomPrenom nvarchar(255), etc ....

    2-La table des codes de pointage (P) :
    pointage (PoinID int identity primary key, Libelle nvarchar(100))

    3-La table de pointages (SM) :
    (EmpID int, J_1, j_2, ... j_31) en code recevant le code de pointage (PoinID). j_x représente le n° du jour dans le mois. Si employé est absent, un responsable pointe à sa place avec le code de l'absence. Il y a encore d'autres infos.

    Le pointage journalier : création si nécessaire de l'enregistrement journalier dans la table SM. chaque employé a un enregistrement par jour.

    Là je dois extraire pour le jour consulté ou courant les employés absents (dont le code PoinID <> 5 et <> 12

    Actuellement, ma requête tourne, mais le client veut voir le code de pointage. J'ai des soucis pour faire figurer le code de pointage dans le select. Cela me met toute la requête en question, voilà la requête qui tourne sans problème :
    j'utilise un projet MSAccess XP :


    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
     
    Function ExtraireInfo_ori(Frm)
    Dim Sql As String, S As String, DS As String
    If IsNull(Frm!DateSaisie) Then Frm!DateSaisie = ""
    If Frm!DateSaisie <> "" Then
    DS = Format(Frm!DateSaisie, "DD/MM/YYYY")
    S = "S_" & Str(Day(DS))
    S = Trim(S)
    Sql = "SELECT Travailleurs.NomPrenom, Activites.Activite, Travailleurs.Tel, Travailleurs.Portable,"
    Sql = Sql & " Travailleurs.Tutelle, Travailleurs.Curatelle, Travailleurs.TelTC As [Tél],"
    Sql = Sql & " Travailleurs.CiviliteTC, Activites.NumeroActivite"
    Sql = Sql & " FROM Travailleurs INNER JOIN"
    Sql = Sql & " SituationsMensuelles ON Travailleurs.Numero = SituationsMensuelles.NumeroTravailleur INNER JOIN"
    Sql = Sql & " Activites ON Travailleurs.NumeroActivite = Activites.NumeroActivite"
    Sql = Sql & " WHERE Travailleurs.QuitterCAT = 0 AND SituationsMensuelles.Mois = " & Month(DS)
    Sql = Sql & " AND SituationsMensuelles.Annee = " & Year(DS)
    Sql = Sql & " AND (SituationsMensuelles." & S & "=0 OR SituationsMensuelles." & S & "= 5 OR SituationsMensuelles." & S & "= 12)"
    Sql = Sql & " UNION "
    Sql = Sql & " SELECT T1.NomPrenom, Activites.Activite, T1.Tel, T1.Portable, T1.Tutelle, T1.Curatelle,"
    Sql = Sql & " T1.TelTC, T1.CiviliteTC, Activites.NumeroActivite"
    Sql = Sql & " FROM Travailleurs T1 INNER JOIN"
    Sql = Sql & " Activites ON T1.NumeroActivite = Activites.NumeroActivite"
    Sql = Sql & " WHERE (NOT EXISTS"
    Sql = Sql & " (SELECT SM.NumeroTravailleur"
    Sql = Sql & " FROM SituationsMensuelles AS SM INNER JOIN"
    Sql = Sql & " Travailleurs ON SM.NumeroTravailleur = T1.Numero"
    Sql = Sql & " WHERE (Annee = " & Year(DS) & " AND Mois = " & Month(DS) & ")) AND T1.QuitterCAT = 0)"
    Sql = Sql & " Order By Activites.Activite, Travailleurs.NomPrenom"
    Frm!ListeAbsents.RowSource = Sql
    Frm!ListeAbsents.Requery
    End If
    End Function

    Merci

Discussions similaires

  1. Comment ajouter une icone à une JInternalFrame
    Par wassimb dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 12/07/2006, 16h13
  2. Comment ajouter une photo à mon profil ?
    Par ghita269 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 18/11/2005, 21h36
  3. Comment ajouter une tâche a chaque selection
    Par niCo.nb dans le forum C
    Réponses: 2
    Dernier message: 01/11/2005, 17h26
  4. Réponses: 3
    Dernier message: 07/10/2005, 13h07
  5. [ADO.Net][VB.NET] Comment ajouter une colonne Integer à un DataTable ?
    Par graphicsxp dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/04/2005, 13h08

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