Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 07/02/2011, 14h49   #1
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
Par défaut Différence entre deux tables

Bonjour à tous

J'ai deux tables :
  1. Tab1 (id, name) qui comporte 167 enregistrements et
  2. Tab2 (id, name) identique à Tab1 mais qui comporte 169 enregistrements

Les name dans la table Tab2 sont au nombre de 167 et ressemblent à ceux de Tab1.

Comment je peux faire sortir les deux name supplémentaires dans Tab2 ?
J'ai essayé avec :
Code :
1
2
3
SELECT name FROM Tab2
MINUS
SELECT name FROM Tab1
Merci.
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 14h55   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Tu n'étais pas loin:
Code SQL :
1
2
3
4
 
SELECT name FROM Tab2
except
SELECT name FROM Tab1

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 15h00   #3
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
Je te remercie

J'ai ajouté des conditions mais cela n'a pas marché

Code :
1
2
3
4
 
SELECT name FROM Tab1 WHERE name LIKE '%Manager%'
except
SELECT name FROM Tab2 WHERE name LIKE '%Level2%'
sachant que la condition where porte sur le name
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 15h33   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Tu n'as pas la même condition dans les deux requêtes, est-ce normal ?
D'après ta requête tu veux tous les nom de TAB1 contenant "Manager" SAUF ceux qui sont aussi dans TAB2 et qui contiennent "Level2"...
Est-ce que tu peux nous donner un petit jeu de test avec le résultat attendu ?

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h17   #5
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
Par exemple

Tab1

id Name
14 AAAManager
15 BBBManager
16 CCCManager


Tab 2

id Name

58 AAAManager
96 BBBManager


Je voudrais écrire une requête qui me permet d'afficher l'enregistrement (16, CCCManager) de Tab1
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h38   #6
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
C'est bien ce que je disais, la clause where dans la deuxième requête n'était pas bonne...
Code SQL :
1
2
3
4
SELECT name FROM Tab1 WHERE name LIKE '%Manager%'
except
SELECT name FROM Tab2 WHERE name LIKE '%Manager%'
Maintenant si tu veux aussi l'ID, il faut faire autrement:
Code SQL :
1
2
3
4
5
 
SELECT id,name
FROM tab1
LEFT OUTER JOIN tab2 ON tab1.name = tab2.name
WHERE tab2.id IS NULL AND tab1.name LIKE '%Manager%'
Tu peux aussi utiliser NOT IN, NOT EXISTS... j'avoue que je ne sais pas lequel est le plus performant.

tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h45   #7
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
Je pense que j'ai compliqué la question. En effet il n'y a pas vraiment de 2 tables mais une seule. Je te donne un exemple de quelques enregistrements

Table

id name
1 Proj1_Manager
2 Proj1_Level2
3 Proj2_Manager
4 Proj2_Level2
5 Proj3_Manager


Ma première question n'a pas vraiment de sens. Ce que je voudrais afficher la 5eme ligne de la table.

Petite explication :
Pour chaque projet il y a 2 types de sous projet : Manager et Level2 sauf le dernier qui n'a pas un sous projet de type Level2
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/02/2011, 16h51   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ou comme ceci :
Code :
1
2
3
4
5
6
7
8
9
SELECT *
  FROM Tab1
 WHERE name IN (SELECT name
                  FROM Tab1
                 WHERE name LIKE '%Manager%'
                except
                SELECT name
                  FROM Tab2
                 WHERE name LIKE '%Manager%')
Ou encore changer le IN en jointure.


Edit : évidemment avec le besoin expliqué, ça n'a plus de sens.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h53   #9
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
Merci Waldar pour ta réponse.

Il y a une seule table comme je l'ai écrit dans le message juste en dessus du tien, je vais quand même essayer avec ta proposition
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h55   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Non, essayez plutôt celle-ci :
Code :
1
2
3
4
  SELECT min(id) AS id, min(name) AS name
    FROM MaTable
GROUP BY substring(name, 1, 5)
  HAVING count(*) = 1
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h57   #11
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
pourquoi le min(id) ? les id sont aléatoires
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 17h17   #12
Membre à l'essai
 
Inscription : janvier 2009
Messages : 159
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 159
Points : 21
Points : 21
Remarque, la table contient 167 enregistrements je peux donc chercher à la main mais ce n'est pas pratique.

le but est d'afficher tous les projets qui n'ont pas Level2
wissem.ba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 08h22   #13
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
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 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par wissem.ba Voir le message
le but est d'afficher tous les projets qui n'ont pas Level2
Cette fois le besoin est plus clair !
Code :
1
2
3
4
5
6
7
SELECT t1.id
FROM la_table t1
LEFT OUTER JOIN la_table t2 
    ON SUBSTRING(t2.name FROM 1 TO 5) = SUBSTRING(t1.name FROM 1 TO 5)
    AND t2.name LIKE '%Level2%'
WHERE t1.name LIKE '%Manager%'
    AND t2.id IS NULL
__________________
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é
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h01.


 
 
 
 
Partenaires

Hébergement Web