Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/05/2011, 11h55   #1
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 164
Points : 37
Points : 37
Par défaut Requete suppression d'élément commun

Bonjour,

Je souhaite faire une requête somme un peu complexe en éliminant des éléments communs provenant de 2 tables différentes. voici mes 2 requêtes :


Code :
1
2
3
SELECT SUM(Superficie) AS RESULT 
FROM cav.sb_data_228 
WHERE id_ZA = 3
Code :
1
2
3
4
5
6
7
8
9
10
SELECT SUM(Superficie) AS RESULT 
FROM cav.sb_data_184 
WHERE (id = ANY (SELECT id_Parcelle 
                FROM acte_parcelle 
                WHERE id_Acte = ANY (SELECT id_Acte 
                                     FROM acte 
                                     WHERE ((YEAR(DateActe) = (YEAR(now()) - 1) 
                                           OR YEAR(DateActe) = YEAR(now())) 
                                           AND Type = 'Acquisition'))) 
                                           AND id_ZA = 3)
Il faudrait que dans ma deuxieme requete je ne prenne pas en compte les éléments communs des deux tables qui sont identifiés par "id" dans les 2 tables (id n'apparait pas dans la première requete mais se trouve bien dans la table).

Est ce possible d'imbriquer dans la deuxième requête un filtre permettant de ne pas prendre en compte ces identifiants ?

Merci

SD
mcdelay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 14h43   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Je te déconseille d'utiliser = ANY, car c'est équivalent à IN qui est très nettement plus connu que = ANY.
Utilise ANY lorsqu'il a une valeur ajouté, comme avec une inégalité (< ANY)

En utilisant NOT EXISTS tu dois pouvoir exclure les données de cav.sb_data_228.

J'ai réécris la requête avec des jointures, généralement plus performant que IN :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT SUM(Superficie) AS RESULT 
  FROM cav.sb_data_184 d_184
  JOIN acte_parcelle ap ON d_184.id = ap.id_Parcelle
  JOIN acte a ON ap.id_Acte = a.id_acte
 WHERE (YEAR(a.DateActe) = YEAR(now()) - 1 OR YEAR(a.DateActe) = YEAR(now()))
   AND a.Type = 'Acquisition'
   AND d_184.id_ZA = 3
   AND NOT EXISTS (SELECT 1 
                     FROM cav.sb_data_228 d_228
                    WHERE d_228.id = d_184.id)
, mais elle n' est peut être plus équivalente à la précédente requête car IN est plutôt équivalent à JOIN (SELECT DISTINCT...), donc peut être plutôt :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT SUM(Superficie) AS RESULT 
  FROM cav.sb_data_184 d_184
  JOIN (SELECT DISTINCT ap.id_Parcelle 
          FROM acte_parcelle ap
          JOIN acte a ON ap.id_Acte = a.id_acte
         WHERE (YEAR(a.DateActe) = YEAR(now()) - 1 OR YEAR(a.DateActe) = YEAR(now()))
           AND a.Type = 'Acquisition'
        ) AS t
     ON d_184.id = t.id_Parcelle
  WHERE d_184.id_ZA = 3
    AND NOT EXISTS (SELECT 1 
                     FROM cav.sb_data_228 d_228
                    WHERE d_228.id = d_184.id)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 16h17   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par mcdelay Voir le message
Bonjour,

Je souhaite faire une requête somme un peu complexe en éliminant des éléments communs provenant de 2 tables différentes. voici mes 2 requêtes :


Code :
1
2
3
SELECT SUM(Superficie) AS RESULT 
FROM cav.sb_data_228 
WHERE id_ZA = 3
Tu calcules la somme des superficies des id_ZA = 3 dans la table cav.sb_data_228.

Quel rapport avec l'autre requête qui semble te poser problème ?
Citation:
Code :
1
2
3
4
5
6
7
8
9
10
SELECT SUM(Superficie) AS RESULT 
FROM cav.sb_data_184 
WHERE (id = ANY (SELECT id_Parcelle 
                FROM acte_parcelle 
                WHERE id_Acte = ANY (SELECT id_Acte 
                                     FROM acte 
                                     WHERE ((YEAR(DateActe) = (YEAR(now()) - 1) 
                                           OR YEAR(DateActe) = YEAR(now())) 
                                           AND Type = 'Acquisition'))) 
                                           AND id_ZA = 3)
Il faudrait que dans ma deuxieme requete je ne prenne pas en compte les éléments communs des deux tables qui sont identifiés par "id" dans les 2 tables (id n'apparait pas dans la première requete mais se trouve bien dans la table).
Il y a 3 tables dans ta monstrueuse requête ! De quelles "2 tables" parles-tu ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h35.


 
 
 
 
Partenaires

Hébergement Web