Supposons que j'ai les tableaux suivants:

Étoile avec identifiant et nom
Planète avec Id, Nom et StarId
Lune avec Id, Nom et PlanetId

StarId et PlanetId sont des clés étrangères. Dans entity framework core, il est facile de trouver toutes les lunes qui appartiennent à une étoile particulière :

   var moons = await db.Moons.Where(m => m.Planet.Star.Name == "Sun").ToListAsync();

Ma question est de savoir s'il existe un moyen rapide de faire la même chose dans les transactions SQL. On pourrait le faire avec des jointures. Mais chaque exemple que j'ai vu implique beaucoup plus de paroles qu'on ne le souhaiterait.

-1
William Jockusch 24 mars 2021 à 21:10

2 réponses

Meilleure réponse

Si vous voulez les lunes autour de notre soleil, vous utiliseriez :

select m.*
from Moon m join
     Planet p
     on p.Id = m.planetid join
     Star s
     on s.Id = p.starid
where s.name = 'Sun';

Ce n'est peut-être pas aussi concis que votre syntaxe, mais c'est assez simple en fait.

Certaines personnes n'aiment pas les jointures explicites, elles peuvent donc écrire :

select m.*
from moons m
where m.planet_id in (select p.planet_id
                      from planets p
                      where p.star_id in (select s.star_id
                                          from stars s
                                          where s.name = 'Sun'
                                         )
                     );

Ce style ne m'attire pas et il a tendance à générer des plans d'exécution moins bons.

2
William Jockusch 24 mars 2021 à 19:48

Sur la base de certains commentaires, la réponse semble être "Non, il n'y en a pas. La syntaxe de jointure est nécessaire." Il est bien décrit dans une autre réponse.

0
William Jockusch 24 mars 2021 à 19:23