Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 11h02   #1
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Par défaut Faire une jointure pour éliminer des enregistrements

Bonjour à tous.

J'ai un souci de conception d'une requête.

Je voudrais faire une jointure qui va me chercher les enregistrements qui ne sont PAS dans une table.

J'ai une table des Membres avec un identifiant et j'ai une table des Envois avec également un identifiant de membre (le même). En fin de topic, je met les script de création des deux tables.

Donc, je voudrais selectionner les membres qui ne sont pas dans la table envoi pour un IdCampagne donné. Je pars sur une base tel que :
Code :
1
2
3
 
SELECT M.UserId FROM Membres M
INNER JOIN Envois E ON
Et c'est aprés le ON que je sèche. Je n'arrive pas à faire le lien de jointure ni lui envoyer l'IdCampagne

Pouvez vous m'aider ?




Code :
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
 
 
CREATE TABLE [dbo].[Membres](
	[IdMembre] [int] IDENTITY(1,1) NOT NULL,
	[UserId] [uniqueidentifier] NULL,
	[Nom] [varchar](50) NULL,
	[Prenom] [varchar](50) NULL,
	[Adresse] [varchar](200) NULL,
	[Adresse2] [varchar](200) NULL,
	[Ville] [int] NULL,
	[Sexe] [int] NULL,
	[DateNaiss] [datetime] NULL,
	[SituFam] [int] NULL,
	[EnfantCharge] [int] NULL,
	[CentreInteret] [varchar](50) NULL,
	[DateMAJ] [datetime] NULL,
 CONSTRAINT [PK_Membres] PRIMARY KEY CLUSTERED 
(
	[IdMembre] 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
 
CREATE TABLE [dbo].[Envois](
	[IdEnvoi] [int] IDENTITY(1,1) NOT NULL,
	[UserId] [uniqueidentifier] NULL,
	[IdCampagne] [int] NULL,
	[Envoye] [int] NULL,
	[DateEnvoye] [datetime] NULL,
	[LuMail] [int] NULL,
	[DateLuMail] [datetime] NULL,
	[LuSite] [int] NULL,
	[DateLuSite] [datetime] NULL,
	[ClickMail] [int] NULL,
	[DateClickMail] [datetime] NULL,
	[ClickSite] [int] NULL,
	[DateClickSite] [datetime] NULL,
	[Paye] [int] NULL,
	[DatePaye] [datetime] NULL
) ON [PRIMARY]
 
GO
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h24   #2
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
A force d'essai j'ai touvé une idée, mais je trouve que ça ressemble plus à du bricolage. Dites moi ce que vous en pensez d'un point de veu empirique, mais aussi d'un point de vue performance car la table membre est censée avoir dans les 100 000 enregistrements (une fois le site en plein régime) et la table envoi aura des millions de lignes à terme. Il est prévu 3 envois par jour pour la moitié au moins des membres.

Outre le fait que je vais travailler mes index à fond, je ne voudrais pas mettre en place une requête qui va me mettre mon serveur à genoux.

Donc voici l'idée sur laquelle je suis actuellement :
Code :
1
2
3
4
 
SELECT M.USerId FROM Membres M
LEFT JOIN Envois E ON E.UserId = M.UserId AND E.IdCampagne = @IdCampagne
WHERE ISNULL(E.IdEnvoi,0) = 0
Le coup de passer par un ISNULL me perturbe.
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h25   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous pouvez passer par une jointure externe :
Code :
1
2
3
4
5
6
SELECT M.UserId
  FROM dbo.Membres M
       LEFT OUTER JOIN dbo.Envois E
         ON E.UserId     = M.UserId
        AND E.IdCampagne = @IdCampagne
 WHERE E.IdEnvoi IS NULL
Par un test d'existence :
Code :
1
2
3
4
5
6
SELECT M.UserId
  FROM dbo.Membres M
 WHERE NOT EXISTS (SELECT NULL
                     FROM dbo.Envois E
                    WHERE E.UserId     = M.UserId
                      AND E.IdCampagne = @IdCampagne)
Par une "soustraction d'ensemble" :
Code :
1
2
3
4
5
6
SELECT M.UserId
  FROM dbo.Membres M
EXCEPT 
SELECT E.UserId
  FROM dbo.Envois E
 WHERE E.IdCampagne = @IdCampagne
Par contre, il n'y a pas redondance entre vos colonnes uniqueidentifier et identity ?
Si vous cherchez de la performance, laissez tomber les uniqueidentifier.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2010, 11h46   #4
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Merci pour ton aide.

Sur le point du UniqueIdentifier, je ne peux pas le laisser tomber, c'est une contrainte de mon système. C'est le type d'identifiant pour le MemberShip en .NET et comme j'exploite à fond cette technologie, je suis "coincé" dedans.

Par contre, c'est vrai que j'aurais pu mettre la colone UserId de la table Membre comme Primary Key, au lieu de mettre un banal compteur. Je réfléchi encore sur ce point car mon modèle de donnée n'est pas encore fixe.

Merci pour les trois méthodes, en l'état elle fonctionne bien mais avec 10 enregistrement dans chaque table, j'ai du mal à voir les performances : qu'elle la méthode la moins gourmande en ressource sur le serveur ?
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h54   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Si vos tables sont correctement indexées ça devrait être équivalent (et rapide).
J'ai fait le test avec deux tables de 3M de lignes, ça répond en trois secondes (pour un résultat de presque 3M lignes aussi).
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h56   #6
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Merci pour tout, je garde les scripts précieusement dans un coin et j'utilise le premier pour mon cas présent.

Bon week-end.
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h54.


 
 
 
 
Partenaires

Hébergement Web