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

Langage SQL Discussion :

Divers aide requête SQL approfondie


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Divers aide requête SQL approfondie
    Bonjour,

    j'aurais besoin de votre aide pour une requête spécifique.

    J'ai deux tables:
    - une table "airfield_event" qui indique le statut (nationalité) d'une base à un temps donné (tik) ainsi que ses coordonnées
    - une table "plane" qui indique sa nationalité et sa position en fin de mission notamment

    Je souhaite faire une requête qui indique si l'avion est posé sur un terrain ami (le caractère ami étant déterminé par la dernière nationalité correspondante du terrain).

    Pour l'instant j'en suis ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT Planes.country_id, aircraft_id, airfield_event.airfield_id, airfield_event.country_id,
    	CASE
    		WHEN Planes.country_id=airfield_event.country_id THEN "FRIENDLY"
    		ELSE "OTHER"
    	END
    FROM Planes JOIN airfield_event
    WHERE
    (posx_end - airfield_event.posx) BETWEEN -1500 AND 1500
    AND (posz_end - airfield_event.posz) BETWEEN -1500 AND 1500
    AND posx_end NOT NULL
    ORDER BY Planes.aircraft_id
    Ma requête actuelle, vérifie si la dernière position de l'avion est proche de moins de 1500m d'une coordonnée d'un airfield actif.

    Extrait du résultat de la rerquête:

    country_id aircraft_id airfield_id country_id CASE
    WHEN Planes.country_id=airfield_event.country_id THEN "FRIENDLY"
    ELSE "OTHER"
    END
    201 700428 573440 201 FRIENDLY
    201 700446 573440 201 FRIENDLY
    201 770103 573440 201 FRIENDLY
    201 780306 573440 201 FRIENDLY
    101 781316 91136 201 OTHER
    101 781316 91136 101 FRIENDLY
    Il faut maintenant que je trouve le moyen de comparer avec la dernière nationalité de l'airfield (le résultat de la requête me donne deux lignes si l'airfield a changé de nationalité en cours de mission = exemple pour l'aircraft_id = 781316).

    J'ai essayé avec un MAX(airfield_event.tik) mais cela me donne une seule ligne.

    A+

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    La recherche du premier/dernier/plus grand/plus petit revient très souvent.
    Escartefigue nous a fait un blog qui donne divers moyen d'y arriver.

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    La recherche du premier/dernier/plus grand/plus petit revient très souvent.
    Escartefigue nous a fait un blog qui donne divers moyen d'y arriver.

    Tatayo.
    Re,

    Merci je suis arrivé à corriger ma requête

    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
    SELECT DISTINCT Planes.country_id, aircraft_id, airfield_event.airfield_id, airfield_event.country_id,
    	CASE
    		WHEN Planes.country_id=airfield_event.country_id THEN "FRIENDLY"
    		ELSE "ENNEMY"
    	END
    FROM Planes JOIN airfield_event
    ON (posx_end - airfield_event.posx) BETWEEN -1500 AND 1500
    AND (posz_end - airfield_event.posz) BETWEEN -1500 AND 1500
    AND posx_end NOT NULL
    WHERE airfield_event.tik = (SELECT MAX(airfield_event.tik)            
            FROM airfield_event
            WHERE (posx_end - airfield_event.posx) BETWEEN -1500 AND 1500
    		AND (posz_end - airfield_event.posz) BETWEEN -1500 AND 1500
    		AND posx_end NOT NULL)
    ORDER BY Planes.aircraft_id

    Bloquant pour la transformer en update, j'ai trouvé un moyen intermédiaire en rajoutant le code nationalité (mai nécessite une deuxième étape pour convertir le code nationalité en "FRIENDLY" ou "ENNEMY")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE Planes
    SET airfield_land = (SELECT airfield_event.country_id
    						FROM airfield_event
                            WHERE (posx_end - airfield_event.posx) BETWEEN -1500 AND 1500
    						AND (posz_end - airfield_event.posz) BETWEEN -1500 AND 1500
    						AND posx_end NOT NULL
    						AND airfield_event.tik =(SELECT MAX(airfield_event.tik)            
    													FROM airfield_event
    													WHERE (posx_end - airfield_event.posx) BETWEEN -1500 AND 1500
    													AND (posz_end - airfield_event.posz) BETWEEN -1500 AND 1500
    													AND posx_end NOT NULL)
    													)

    J'aurais préféré transformer ma 1ère requête SELECT/CASE en requête UPDATE mais cela ne fonctionne pas, j'ai une erreur de syntaxe "FROM", une idée ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par fabgenius Voir le message
    J'aurais préféré transformer ma 1ère requête SELECT/CASE en requête UPDATE mais cela ne fonctionne pas, j'ai une erreur de syntaxe "FROM", une idée ?
    Le fait de pourvoir faire un FROM ne fonctionne pas sous Oracle par exemple.
    C'est quoi ton SGBD ?
    Le savoir est une nourriture qui exige des efforts.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Novembre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Novembre 2018
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Re,

    Ma base de données est en sqlite.

    A+

  6. #6
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Re,

    je vois 2 problèmes potentiels :
    1- problèmes d'alias de table
    2- problème de doublons

    1- problèmes d'alias de table
    Les sous requêtes synchronisées utilisent la même table en cascade sans alias, possibilité de confusion dans le choix des sources.

    2- problème de doublons
    Si la sous-requête finale peut ramèner plus d'une valeur (même un doublon) on ne sait pas quelle valeur prendre.
    Un Max ou un Min fera certainement l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE Planes
    SET airfield_land = (SELECT max(airfield_event.country_id)
                            FROM airfield_event
                            WHERE Planes.posx_end - airfield_event.posx BETWEEN -1500 AND 1500
                            AND Planes.posz_end - airfield_event.posz BETWEEN -1500 AND 1500
                            AND Planes.posx_end NOT NULL
                            AND airfield_event.tik =(SELECT MAX(ae.tik)            
                                                        FROM airfield_event ae
                                                        WHERE Planes.posx_end - ae.posx BETWEEN -1500 AND 1500
                                                        AND Planes.posz_end - ae.posz BETWEEN -1500 AND 1500
                                                        AND Planes.posx_end NOT NULL)
                        )
    Le savoir est une nourriture qui exige des efforts.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/11/2007, 22h23
  2. Aide Requête SQL
    Par jjg65 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/07/2007, 10h37
  3. Aide requête SQL - UPDATE phpmyadmin
    Par laulau37 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/06/2007, 10h19
  4. Aide requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 18
    Dernier message: 14/09/2006, 21h31
  5. Aide Requête SQL (UPDATE)
    Par Glowprod dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/07/2006, 14h04

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