Bonjour,
Je suis coincé pour un petit problème.
Voilà, j'ai une table TRAVAILLER contenant deux champs : Personne et Lieu.
J'aimerai trouver comment obtenir les personnes qui ont fréquenté tous les lieux.
D'avance merci
Bonjour,
Je suis coincé pour un petit problème.
Voilà, j'ai une table TRAVAILLER contenant deux champs : Personne et Lieu.
J'aimerai trouver comment obtenir les personnes qui ont fréquenté tous les lieux.
D'avance merci
Vos termes sont inexacts.
J'imagine que vous avez une table LIEU ?
Dans tous les cas, donnez nous un jeu d'essai minimal.
Pensez aussi à indiquer votre SGBD et sa version.
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Il s'agit d'une question théorique. le but de ma démarche est d'avoir une solution en langage SQL pour obtenir tous les enregistrements d'une table qui présentent pour un champ, toutes les solutions possibles pour un autre champ.
exemple avec jeu d'essai :
Personne Lieu
Toto France
Titi Allemagne
Tata Portugal
Toto Allemagne
Tutu Portugal
Tutu Espagne
Tata Espagne
Toto Angleterre
Tete Angleterre
Toto Espagne
Il y a 5 pays dans le champ Lieu. Seul Toto a été dans tous les pays. Par conséquent il remplit les conditions demandées. Ma question est de savoir comment obtenir Toto en langage SQL.
Comment obtenir par ailleurs les personnes qui ont toujours travaillé ensemble (exemple :Tata et Tutu ) ?
Comment savoir qu'ils étaient ensemble ? D'après le contenu de la table, je sais qu'ils ont été dans les mêmes pays, mais je n'ai aucune connaissance de la période à laquelle chacun s'y trouvait...Envoyé par sylverel
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Pour la première question, le simple fait d'énoncer le problème donne la structure de la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select personne from travailler group by personne having count(distinct lieu) = ( select count(distinct lieu) from travailler ) ;
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Ah ouais, tiens moi j'aurais fait un NOT EXISTS sur le couple (personne, lieu) mais ce qui compte c'est que le résultat soit celui attendu.
A voir donc selon les performances.
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Je suis curieux de savoir comment tu fais...Envoyé par Magnus
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Si si ça se fait : j'avais vu ça à la fac avec 3 tables :Envoyé par al1_24
- personne
- lieu
- visiter
Le principe consistait à utiliser 2 requêtes imbriquées (donc sur 3 niveaux) en utilisant l'ensemble complémentaire du suivant : "les personnes qui n'ont pas fréquenté au moins un des lieux".
Je ne suis pas à l'aise avec ce genre de requêtes donc je ne te promets pas de pouvoir te la donner mais peut être y arriveras-tu avant moi avec ces indications ?
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
que pensez vous de la requête suivante pour trouver les personnes qui ont toujours travaillé ensemble (qui revient à dire qu'ils ont toujours fréquenté les mêmes lieux )?
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 SELECT T1.PERSONNE, T2.PERSONNE FROM A_TRAVAILLé T1, A_TRAVAILLé T2 WHERE NOT EXISTS (SELECT * FROM A_TRAVAILLé T3 WHERE T3.PERSONNE = T1.PERSONNE AND NOT EXISTS (SELECT * FROM A_TRAVAILLé T4 WHERE T4.PERSONNE = T2.PERSONNE AND T4.LIEU = T3.LIEU)) AND NOT EXISTS (SELECT * FROM A_TRAVAILLé T3 WHERE T3.PERSONNE = T2.PERSONNE AND NOT EXISTS (SELECT * FROM A_TRAVAILLé T4 WHERE T4.PERSONNE = T1.PERSONNE AND T4.LIEU = L3.LIEU));
Envoyé par sylverelS'ils ne doivent avoir travaillé que dans un seul lieu, il suffit d'ajouter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select L1.LIEU , L1.PERSONNE , L2.PERSONNE from TRAVAILLER as L1 inner join TRAVAILLER as L2 on L2.LIEU = L1.LIEU and L2.PERSONNE > L1.PERSONNE ;
PS : La liste des valeurs retournées par la requête référence par EXISTS n'est pas utilisée. Dans ces conditions, si le SGBD n'est pas optimisé, utiliser select * peut être contre performant...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 where not exists ( select 1 from TRAVAILLER as L3 where L3.LIEU <> L1.LIEU and L3.PERSONNE in (L2.PERSONNE, L1.PERSONNE) )
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager