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 :

DISTINCT 2 tables sans UNION [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 57
    Points
    57
    Par défaut DISTINCT 2 tables sans UNION
    Bonjour.

    Sous SSAS, j'ai une Named Query qui utilise un UNION pour récupérer 3 champs dans 2 tables.
    Je souhaiterais :
    - remplacer cette Named Query par une vue SQL indexée pour gagner en perf (je l'espère) donc pas d'utilisation de l'instruction UNION
    - que les couples des 3 valeurs soit unique pour faire une unique clusterd key dessus
    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
    61
    62
     
    CREATE TABLE t1 (
    	[pk] [int] IDENTITY(1, 1) NOT NULL
    	,[id] [varchar](23) NULL
    	,[idSociete] [smallint] NULL
    	,[idExercice] [smallint] NULL
    	,CONSTRAINT [PK_t1] PRIMARY KEY NONCLUSTERED ([pk] ASC)
    	) ON [PRIMARY]
     
    CREATE TABLE t2 (
    	[pk] [int] IDENTITY(1, 1) NOT NULL
    	,[idTransaction] [varchar](23) NULL
    	,[idSocieteEmettrice] [smallint] NULL
    	,[idExercice] [smallint] NULL
    	,CONSTRAINT [PK_t2] PRIMARY KEY NONCLUSTERED ([pk] ASC)
    	) ON [PRIMARY]
     
    INSERT INTO t1 (
    	[id]
    	,[idSociete]
    	,[idExercice]
    	)
    VALUES (
    	'aa-b'
    	,1
    	,1314
    	)
    	,(
    	'aa-c'
    	,1
    	,1314
    	)
    	,(
    	'aa-c'
    	,1
    	,1314
    	)
     
    INSERT INTO t2 (
    [idTransaction ]
    	,[idSocieteEmettrice]
    	,[idExercice]
    	)
    VALUES (
    	'aa-d'
    	,1
    	,1314
    	)
    	,(
    	'aa-b'
    	,1
    	,1314
    	)
    	,(
    	'aa-c'
    	,1
    	,1314
    	) (
    	'aa-d'
    	,1
    	,1314
    	)
    Je peux donc avoir des doublons à l’intérieur d'une table et de l'une à l'autre.

    Je souhaite donc en résultat:
    id, idSociete, idExercice
    'aa-b',1,1314
    'aa-c',1,'1314
    'aa-d',1,1314
    J'ai donc fais:
    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
    SELECT DISTINCT id
    	,idSociete
    	,idExercice
    FROM (
    	SELECT CASE 
    			WHEN t2.idTransaction IS NOT NULL
    				THEN t2.idTransaction
    			ELSE t1.id
    			END AS id
    		,CASE 
    			WHEN t2.idSocieteEmettrice IS NOT NULL
    				THEN t2.idSocieteEmettrice
    			ELSE t1.idSociete
    			END AS idSociete
    		,CASE 
    			WHEN t2.idExercice IS NOT NULL
    				THEN t2.idExercice
    			ELSE t1.idExercice
    			END AS idExercice
    	FROM tabTransaction t1
    	LEFT JOIN tabPassage t2
    		ON t1.id = t2.idTransaction
    			AND t1.idSociete = t2.idSocieteEmettrice
    			AND t1.idExercice = t2.idExercice
    	) AS t3
    Il me semble que ça fonctionne, mais est-ce le plus performant? (Mise à part l'utilisation de clé alternatives pour ne pas avoir de type char en clé)

    Merci.
    sdisp

  2. #2
    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,

    Vous ne pourrez pas indexer la vue avec cette requête :
    Elle contient des sous requêtes, ainsi que des jointures externes...

    Mais je pense que c'est plutôt le modèle qui faudrait revoir, et sans doute mettre en place l'héritage.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 57
    Points
    57
    Par défaut
    Bonjour et merci pour cette réponse.

    Effectivement je ne peux pas non plus créer d'index sur cette vu.
    Pour ce qui est du schéma, en faite, je crée un cube basé sur 2 tables de faits, une table de transaction et une table de passage.
    Dans chacune de ces 2 tables j'ai donc l'id transaction et pour avoir en dimension cet id transaction, il me semble que je suis contraint de créer cette vue (ou la named query) qui regroupe les id des 2 tables?

    qu'en dites-vous?
    Merci.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Dans votre nouveau query il faudrait un FULL JOIN et non un simple LEFT JOIN.

    Mais plus important, si vous en faites une vue avec JOIN + CASE/ISNULL, elle sera sans doute non SARGable (comprenez: indexes mal exploité).
    Je pense que l'UNION par contre permettrait à la vue d'être SARGable.

    Faites donc :

    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
     
    	CREATE VIEW maView AS
    	SELECT DISTINCT *
    	FROM (
    		SELECT
    				id
    				, idSociete
    				, idExercice
    		FROM t1
     
    		UNION ALL
     
    		SELECT
    				id
    				, idSociete
    				, idExercice
    		FROM t2
    	) AS X
    Most Valued Pas mvp

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 57
    Points
    57
    Par défaut
    Bonjour et merci pour cette réponse.

    Apparemment pas non plus d'index sur les requêtes utilisant des derived table

    sdisp+

  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
    Bonjour,

    Les index peuvent être utilisés pour une requête contenant des tables dérivées.

    En revanche, une vue contenant des sous requêtes ne peut en effet pas être indexée, pas plus qu'une vue contenant un UNION , une jointure externe, ou tout un tas d'autres choses...

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par sdisp+ Voir le message
    Bonjour et merci pour cette réponse.

    Apparemment pas non plus d'index sur les requêtes utilisant des derived table

    sdisp+
    Je ne suggère pas de crée une view indexée, mais une simple view où les tables ont des indexes.
    Most Valued Pas mvp

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 57
    Points
    57
    Par défaut
    Merci je vais faire comme ça.
    sdisp

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

Discussions similaires

  1. Faire une Union de deux tables sans passer par UNION
    Par allouchi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/06/2011, 10h19
  2. union de deux tables sans doublons
    Par saou85 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 03/09/2010, 16h20
  3. classer par date les resultats de 2 tables avec UNION
    Par dgedge dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/06/2005, 19h23
  4. exporter une table sans le nom de colonnes ?
    Par vuldos dans le forum Access
    Réponses: 13
    Dernier message: 11/10/2004, 19h56
  5. Lister le contenu d'une table sans connaitre ses champs
    Par Google.be dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 30/03/2004, 15h23

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