Article complet: Trois petites fonctions de calcul de jointures

20/04/2009

[SGBD][SQL Server] Trois petites fonctions de calcul de jointures

Voici trois petites fonctions pour ceux qui utilisent du SQL dynamique, afin de réaliser de manière automatique différentes jointures entre deux tables...

[Suite:]

1 - Jointure naturelle

La première consiste à effectuer la jointure naturelle, c'est à dire à joindre les deux tables sur les colonnes ayant même nom. Rappelons que dans un système d'information, les informations doivent avoir un nom unique (norme AFNOR).

CREATE FUNCTION dbo.F_SCRIPT_NATURAL_JOIN  
   (@SHEMA_LEFT  SYSNAME, @TABLE_LEFT  SYSNAME, @ALIAS_LEFT  SYSNAME, 
    @SHEMA_RIGHT SYSNAME, @TABLE_RIGHT SYSNAME, @ALIAS_RIGHT SYSNAME) 
RETURNS VARCHAR(max) 
AS 
/******************************************************************************  
* fonction de calcul de jointure naturelle                                   * 
*******************************************************************************  
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-04-10 * 
*******************************************************************************  
* Cette fonction calcule la jointure naturelle de deux tables,                *  
******************************************************************************/  
BEGIN 
   DECLARE @OUT VARCHAR(max); 
   SET @OUT = ''; 
   SELECT @OUT = @OUT + @ALIAS_LEFT +'.' + COLUMN_NAME +' = ' + @ALIAS_RIGHT + '.' + COLUMN_NAME + ' AND ' 
   FROM   (SELECT COLUMN_NAME 
           FROM   INFORMATION_SCHEMA.COLUMNS 
           WHERE  TABLE_SCHEMA = @SHEMA_LEFT 
             AND  TABLE_NAME   = @TABLE_LEFT 
           INTERSECT 
           SELECT COLUMN_NAME 
           FROM   INFORMATION_SCHEMA.COLUMNS 
           WHERE  TABLE_SCHEMA = @SHEMA_RIGHT 
             AND  TABLE_NAME   = @TABLE_RIGHT) AS T;   
 
   IF LEN(@OUT) > 4 
      SET @OUT = SUBSTRING(@OUT, 1, LEN(@OUT) - 4); 
   RETURN @OUT; 
    
END    
GO

2 - Auto jointure

Il s'agit de joindre la table sur un clone de cette même table (par exemple avec un des pseudo table inserted ou deleted) c'est à dire de clef à clef.

CREATE FUNCTION dbo.F_SCRIPT_SELF_JOIN  
   (@SHEMA  SYSNAME, @TABLE  SYSNAME, @ALIAS_LEFT  SYSNAME, @ALIAS_RIGHT SYSNAME) 
RETURNS VARCHAR(max) 
AS 
/******************************************************************************  
* fonction de calcul d'auto jointure                                         * 
*******************************************************************************  
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-04-10 * 
*******************************************************************************  
* Cette fonction calcule la jointure naturelle de deux tables,                *  
******************************************************************************/  
BEGIN 
   DECLARE @OUT VARCHAR(max); 
   SET @OUT = ''; 
   SELECT @OUT = @OUT + @ALIAS_LEFT +'.' + COLUMN_NAME +' = ' + @ALIAS_RIGHT + '.' + COLUMN_NAME + ' AND ' 
   FROM   (SELECT COLUMN_NAME 
           FROM   INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU 
                  INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
                        ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA 
                           AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
           WHERE  TC.TABLE_SCHEMA = @SHEMA 
             AND  TC.TABLE_NAME   = @TABLE 
             AND  CONSTRAINT_TYPE = 'PRIMARY KEY') AS T;   
 
   IF LEN(@OUT) > 4 
      SET @OUT = SUBSTRING(@OUT, 1, LEN(@OUT) - 4); 
   RETURN @OUT; 
    
END    
GO

3 - Jointure référentielle

Cette troisième fonction permet de réaliser la jointure d'une table fille avec sa table mère liée par l'intégrité référentielle.

CREATE FUNCTION dbo.F_SCRIPT_REF_JOIN  
   (@SHEMA_MERE  SYSNAME, @TABLE_MERE  SYSNAME, @ALIAS_LEFT  SYSNAME,  
    @SHEMA_FILLE SYSNAME, @TABLE_FILLE SYSNAME, @ALIAS_RIGHT SYSNAME) 
RETURNS VARCHAR(max) 
AS 
/******************************************************************************  
* fonction de calculs de jointure référentielle                               * 
*******************************************************************************  
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-04-10 * 
*******************************************************************************  
* Cette fonction calcule la jointure référentielle entre deux tables, l'une   * 
* mère l'autre fille                                                          *  
******************************************************************************/  
BEGIN 
   DECLARE @OUT VARCHAR(max); 
   SET @OUT = ''; 
   SELECT @OUT = @OUT + @ALIAS_LEFT +'.' + COL_MERE +' = ' + @ALIAS_RIGHT + '.' + COL_FILLE + ' AND ' 
   FROM   (SELECT KCU_PRIMARY.COLUMN_NAME AS COL_MERE,  
                  KCU_FOREIGN.COLUMN_NAME AS COL_FILLE 
           FROM   INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
                  INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC_PRIMARY 
                        ON RC.UNIQUE_CONSTRAINT_SCHEMA = TC_PRIMARY.CONSTRAINT_SCHEMA 
                        AND RC.UNIQUE_CONSTRAINT_NAME = TC_PRIMARY.CONSTRAINT_NAME 
                  INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC_FOREIGN 
                        ON RC.CONSTRAINT_SCHEMA = TC_FOREIGN.CONSTRAINT_SCHEMA 
                        AND RC.CONSTRAINT_NAME = TC_FOREIGN.CONSTRAINT_NAME 
                  INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU_PRIMARY 
                        ON TC_PRIMARY.CONSTRAINT_SCHEMA = KCU_PRIMARY.CONSTRAINT_SCHEMA 
                        AND TC_PRIMARY.CONSTRAINT_NAME = KCU_PRIMARY.CONSTRAINT_NAME 
                  INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU_FOREIGN 
                        ON TC_FOREIGN.CONSTRAINT_SCHEMA = KCU_FOREIGN.CONSTRAINT_SCHEMA 
                        AND TC_FOREIGN.CONSTRAINT_NAME = KCU_FOREIGN.CONSTRAINT_NAME 
           WHERE  TC_PRIMARY.TABLE_SCHEMA = @SHEMA_MERE 
             AND  TC_PRIMARY.TABLE_NAME = @TABLE_MERE 
             AND  TC_FOREIGN.TABLE_SCHEMA = @SHEMA_FILLE 
             AND  TC_FOREIGN.TABLE_NAME = @TABLE_FILLE 
             AND  KCU_PRIMARY.ORDINAL_POSITION = KCU_FOREIGN.ORDINAL_POSITION  ) AS T;   
   IF LEN(@OUT) > 4 
      SET @OUT = SUBSTRING(@OUT, 1, LEN(@OUT) - 4); 
   RETURN @OUT; 
    
END    
GO

---
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation
* * * * * Enseignant au CNAM PACA et à l'ISEN à Toulon * * * * *

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0

Cet article n'a pas de Commentaires/Pingbacks pour le moment...

Vous devez être identifié pour poster un commentaire.

Liste des blogs

< Le blog de SQLpro/>

Fred Brouard alias SQLpro

Rechercher

<  Novembre 2011  >
Lun Mar Mer Jeu Ven Sam Dim
  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        

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web