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 :

[2005] obtenir le contraire d'une jointure


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    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 : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut [2005] obtenir le contraire d'une jointure
    Bonjour,

    Comment obtenir le contraire de que l'on obtient avec un inner join ?

    Vu que je ne crois pas être clair, voilà du concret...

    Tout d'abord, mes deux tables :

    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
    USE [Tickets]
    GO
    /****** Object:  Table [dbo].[tblSalesUsedTill]    Script Date: 05/31/2012 15:35:09 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[tblSalesUsedTill](
    	[UTL_Id] [int] IDENTITY(1,1) NOT NULL,
    	[STR_Id] [char](3) NOT NULL,
    	[UTL_Till] [int] NOT NULL,
    	[UTL_Start] [datetime] NOT NULL,
    	[UTL_End] [datetime] NULL,
    	[UTL_CreatedBy] [varchar](100) NULL CONSTRAINT [DF_tblSalesUsedTill_UTL_CreatedBy]  DEFAULT (suser_sname()),
    	[UTL_CreatedOn] [datetime] NULL CONSTRAINT [DF_tblSalesUsedTill_UTL_CreatedOn]  DEFAULT (getdate()),
    	[UTL_ModifiedBy] [varchar](100) NULL,
    	[UTL_ModifiedOn] [datetime] NULL,
     CONSTRAINT [PK_tblVenteCaisse] PRIMARY KEY NONCLUSTERED 
    (
    	[UTL_Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [NDX]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    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
    USE [Tickets]
    GO
    /****** Object:  Table [dbo].[tblSalesTillClosure]    Script Date: 05/31/2012 15:35:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[tblSalesTillClosure](
    	[TCS_Id] [int] IDENTITY(1,1) NOT NULL,
    	[STR_Id] [char](3) NOT NULL,
    	[TCS_Date] [datetime] NOT NULL,
    	[TCS_Till] [int] NOT NULL,
    	[TCS_Amount] [decimal](6, 2) NOT NULL,
    	[TCS_CreatedBy] [varchar](100) NULL CONSTRAINT [DF_tblSalesTillClosure_TCS_CreatedBy]  DEFAULT (suser_sname()),
    	[TCS_CreatedOn] [datetime] NULL CONSTRAINT [DF_tblSalesTillClosure_TCS_CreatedOn]  DEFAULT (getdate()),
    	[TCS_ModifiedBy] [varchar](100) NULL,
    	[TCS_ModifiedOn] [datetime] NULL,
     CONSTRAINT [PK_tblSalesTillClosure] PRIMARY KEY CLUSTERED 
    (
    	[TCS_Id] 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
    SET ANSI_PADDING OFF
    Si je fais une requête sur tblSalesTillClosure avec un inner join vers l'autre table avec comme critère de jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTL.STR_Id = TCS.STR_ID AND UTL.UTL_Till = TCS.TCS_Till
    je vais alors obtenir les lignes dont les valeurs de STR_Id et TCS_Till se retrouvent dans la 2e table.

    Or, je cherche à avoir pile l'inverse (l'opposé ?). C'est-à-dire les lignes dont les valeurs de ces 2 colonnes ne se retrouvent pas dans la 2e table.

    Y a-t-il une manière spécifique d'écrire la jointure pour faire ce genre de chose ou bien dois-je écrire une requête en utilisant l'opérateur EXCEPT ?

    J'imagine que je devrais y arriver plus ou moins facilement avec except mais j'ai le sentiment que c'est pas la meilleure manière.

    Kropernic.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Est ce qu'un répond à ta demande ?

  3. #3
    Membre expérimenté
    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 : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ah ! Je vais tester cela !

    Je n'ai encore jamais utilisé exists jusqu'ici... C'est l'occasion de tester

  4. #4
    Membre expérimenté
    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 : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Après quelques tests, je suis forcé de constater que je n'y arrive pas.

    Pour le moment, j'ai écrit ceci :
    (j'ai des problème pour l'indentation du code sur le forum)
    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
    select distinct 
    	STR_ID, TCS_TILL, TCS_DATE
    from 
    	tblSalesTillClosure
    where 
    	not exists (select
    					TCS.*
    				from	
    					tblSalesTillClosure TCS
    						inner join tblSalesUsedTill UTL
    							on	TCS.STR_ID = UTL.STR_ID
    							and TCS.TCS_Till = UTL.UTL_Till
    							and	TCS.TCS_Date >= UTL.UTL_Start
    				where	
    					TCS_Date between '2012-01-02' and '2012-01-03'
    				and UTL_END is null
    									)
    order by
    	STR_ID,
    	TCS_Till
    Or cette requête ne me retourne rien alors que je devrais avoir au moins une ligne avec les données de tests que j'ai introduites (p-e plus mais j'en ai moins trouvée une manuellement).

    Je suis à peu près certain que c'est moi qui utilise mal la fonction exists mais j'ai du mal à voir comment procéder...

    Kropernic.

    EDIT :

    Un exemple supplémentaire trouvé sur le net m'a mis sur la voie.
    La requête suivante me donne le résultat attendu :
    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
    select distinct 
    	STR_ID, TCS_TILL, TCS_DATE
    from 
    	tblSalesTillClosure TCS
    where 
    	not exists (select
    					*
    				from	
    					tblSalesUsedTill UTL
    				where 
    					TCS.STR_ID = UTL.STR_ID
    				and TCS.TCS_Till = UTL.UTL_Till
    				and	TCS.TCS_Date >= UTL.UTL_Start
    				and UTL_END is null
    									)
    and	TCS_Date between '2012-01-02' and '2012-01-03'
    order by
    	STR_ID,
    	TCS_Till
    Qu'en pensez-vous ? Est-il possible de l'améliorer ?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/04/2012, 07h42
  2. Réponses: 5
    Dernier message: 17/05/2011, 17h11
  3. Réponses: 1
    Dernier message: 18/06/2008, 23h53
  4. Obtenir un COUNT() = 0 lors d'une jointure ?
    Par elvex dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/07/2007, 21h48
  5. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10

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