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 :

Insertion sans doublons


Sujet :

Développement SQL Server

  1. #1
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut Insertion sans doublons
    Salut,

    Je souhaite calculer des distance entre villes et insérer le résultat dans une table. Seulement, je n'arrive pas à trouver une solution pour calculer la distance Marseille - Paris sans par la suite calculer la distance Paris - Marseille.

    Voici de quoi illustrer mes propos.

    Création des 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
    CREATE TABLE [dbo].[VILLE_1](
    	[LIB_VILLE] [nvarchar](255) NULL,
    	[CODE_INSEE] [float] NOT NULL,
    	[LATITUDE] [nvarchar](255) NULL,
    	[LONGITUDE] [nvarchar](255) NULL
    ) ON [PRIMARY]
     
    -----------------------------------------------------
     
    CREATE TABLE [dbo].[DISTANCE_1](
    	[ID_DISTANCE] [int] IDENTITY(1,1) NOT NULL,
    	[POINT_A] [varchar](50) NULL,
    	[POINT_B] [varchar](50) NULL,
    	[VALEUR] [float] NULL,
     CONSTRAINT [PK_DISTANCE_1] PRIMARY KEY CLUSTERED 
    (
    	[ID_DISTANCE] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Peuplement de la table VILLE_1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('La Roquette-sur-Siagne', 6108, '43.6', '6.95')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('La Roquette-sur-Var', 6109, '43.833333', '7.2')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Roubion', 6110, '44.083333', '7.05')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Roure', 6111, '44.083333', '7.083333')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Le Rouret', 6112, '43.683333', '7.016667')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Sainte-Agnès', 6113, '43.8', '7.466667')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-André', 6114, '43.733333', '7.283333')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Antonin', 6115, '43.916667', '6.983333')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Blaise', 6117, '43.833333', '7.233333')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Cézaire-sur-Siagne', 6118, '43.65', '6.8')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Dalmas-le-Selvage', 6119, '44.283333', '6.866667')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Étienne-de-Tinée', 6120, '44.258333', '6.925')
    INSERT INTO [dbo].[VILLE_1]([LIB_VILLE], [CODE_INSEE], [LATITUDE], [LONGITUDE]) VALUES ('Saint-Jean-Cap-Ferrat', 6121, '43.683333', '7.333333')
    Requête d'insertion de la table DISTANCE_1 :
    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
    insert into DISTANCE_1
    select v1.LIB_VILLE as POINT_A,
    	v2.LIB_VILLE as POINT_B,
    	(6366
    		*acos(
    			cos(radians(cast(isnull(v1.LATITUDE, '0') as float)))
    			*cos(radians(cast(isnull(v2.LATITUDE, '0') as float)))
    			*cos(radians(cast(isnull(v2.LONGITUDE, '0') as float))
    					-radians(cast(isnull(v1.LONGITUDE, '0') as float))
    			)
    			+sin(radians(cast(isnull(v1.LATITUDE, '0') as float)))
    			*sin(radians(cast(isnull(v2.LATITUDE, '0') as float)))
    		)
    	) as VALEUR
    from VILLE_1 v1
    	inner join VILLE_1 v2 on v1.LIB_VILLE <> v2.LIB_VILLE
    where isnull(v1.LATITUDE, '') <> ''
    	and isnull(v1.LONGITUDE, '') <> ''
    	and isnull(v2.LATITUDE, '') <> ''
    	and isnull(v2.LONGITUDE, '') <> ''
    	and abs(abs(cast(isnull(v1.LATITUDE, '0') as float)) - abs(cast(isnull(v2.LATITUDE, '0') as float))) < 1
    	and abs(abs(cast(isnull(v1.LONGITUDE, '0') as float)) - abs(cast(isnull(v2.LONGITUDE, '0') as float))) < 1
    order by v1.LIB_VILLE, v2.LIB_VILLE
    Cette requête insère donc toutes les distances (Marseille - Paris et Paris - Marseille).

    Voyez-vous comment faire le plus simplement possible?

    Merci par avance.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Modifie le prédicat de jointure (ON) comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v1.LIB_VILLE > v2.LIB_VILLE
    Tu obtiendra une matrice diagonale.


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Merci pour cette réponse, ça fonctionne à merveille. Enfin pour ce point en tout cas...
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

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

Discussions similaires

  1. Optimisation d'un INSERT sans doublon
    Par rg77140 dans le forum Optimisations
    Réponses: 3
    Dernier message: 03/04/2013, 12h21
  2. insertion image avec macro sans doublon lors de la réexécution
    Par picogunsy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/07/2010, 15h24
  3. Liste chainée triée sans insertion de doublon
    Par Bogs dans le forum Débuter
    Réponses: 1
    Dernier message: 22/03/2009, 18h50
  4. [Conception] Insertion de données sans doublon
    Par Yukhaa dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/10/2006, 08h35
  5. [Postgresql] insertion sans doublon
    Par Pwill dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/06/2005, 11h37

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