Recherche dans une table avec comparaison par pair

Messages postés
49
Date d'inscription
mercredi 20 décembre 2017
Statut
Membre
Dernière intervention
5 octobre 2019
-
Bonsoir,

Je travail sur la base de données sakila :


Je tente de répondre à cette question depuis une heure :
Existe-t-il des acteurs qui ne jouent avec aucun autre acteur ?

Mon idée serait de selectionner tous les acteurs (col1), tous les acteurs avec lesquelles ils ont joué (col2) et leurs films en communs (col3) comme ceci :


J'ai mis deux fois la même table pour y voir plus clair et voici mon code pour l'instant :


Une fois que j'obtiens ça, pour répondre à la question, il ne me suffirait plus qu'à compter le nombre d'acteurs avec lesquelles chaque acteurs à joué et selectionner les acteurs ayant joué avec 0 autres acteurs.

(Aussi je n'arrive pas à faire le produit cartésien sur une table (afficher comme je l'ai fait une même table deux fois) du coup je suis passé par un WITH AS qui n'est pas une solution optimale).

En vous remerciant par avance :)
Afficher la suite 

1 réponse

Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435
0
Merci
bonjour, peux-tu publier le texte de tes requêtes, au lieu d'images?
je suis un peu déçu que tu renonces à travailler après seulement une heure.
connais-tu le concept de jointure externe? qu'est-ce qui t’empêche de faire le produit cartésien d'une table?
ta syntaxe me semble extraordinairement compliquée, pourquoi pas plutôt:
select t1.actor_id as actor_id1, t2.actor_id as actor_id2 from film_actor as t1, film_actor as t2
where t1.film_id = t2.film_id and t1.actor_id <> t2.actor_id

il te suffira ensuite de transformer cela en jointure externe.
waren56
Messages postés
49
Date d'inscription
mercredi 20 décembre 2017
Statut
Membre
Dernière intervention
5 octobre 2019
-
WITH 
T1 AS (SELECT actor_id, film_id FROM sakila.film_actor), 
T2 AS (SELECT actor_id, film_id FROM sakila.film_actor) 
SELECT T1.actor_id AS actor_id_1, T1.film_id AS film_id_1, T2.actor_id AS actor_id_2 
FROM T1 NATURAL JOIN T2 
WHERE T1.actor_id != T2.actor_id 
AND T1.film_id = T2.film_id


Du coup vous pouvez me dire comment y répondre svp ? J'ai quand même pris du temps à faire ces schémas...
waren56
Messages postés
49
Date d'inscription
mercredi 20 décembre 2017
Statut
Membre
Dernière intervention
5 octobre 2019
-
- Oui je vois ce qu'est un LEFT JOIN mais je ne vois pas pourquoi et/ou comment devrais-je l'appliquer dans ce cas là, il s'agit juste de faire une comparaison non ?
- Le prof m'a dit que pour faire le produit cartésien je pouvais rappeler la même table sous le même nom, par exemple :
WITH 
T1 AS (SELECT actor_id, film_id FROM sakila.film_actor),
SELECT actor_id, film_id, actor_id, film_id FROM T1,T1

Mais ça ne évidemment pas.
waren56
Messages postés
49
Date d'inscription
mercredi 20 décembre 2017
Statut
Membre
Dernière intervention
5 octobre 2019
-
Je vais essayer ce que vous m'avez dit, merci. Je reviendrai ici.
waren56
Messages postés
49
Date d'inscription
mercredi 20 décembre 2017
Statut
Membre
Dernière intervention
5 octobre 2019
-
Je n'ai pas compris pourquoi je devais changer ça en jointure externe. Quel est le but ?
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > waren56
Messages postés
49
Date d'inscription
mercredi 20 décembre 2017
Statut
Membre
Dernière intervention
5 octobre 2019
-
quelle est la différence entre une jointure normale et une jointure externe?
fais une jointure externe, tu verras la différence.
le critère de jointure se spécifie avec ON, pas avec WHERE.
Commenter la réponse de yg_be