PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres Left Join avec la condition where

jointure gauche de deux tables avec une condition where

C'est généralement faux pour utiliser une LEFT [OUTER] JOIN puis filtrer avec un WHERE condition, annulant ainsi la fonction spéciale d'un LEFT JOIN pour inclure toutes les lignes du tableau de gauche sans condition . Explication détaillée :

  • Expliquez plus en détail les suggestions de performance de la condition JOIN par rapport à LEFT JOIN et WHERE

Mettez les conditions censées filtrer toutes les lignes dans le WHERE clause (rid = 2 ), mais créez des conditions pour joindre à gauche les lignes de record_table être des conditions de jointure réelles :

SELECT t.start_date, t.end_date  -- adding those
     , r.id, r.name, r.date 
FROM   time_table t
LEFT   JOIN record_table r ON r.date >= t.start_date
                          AND r.date <  t.end_date
WHERE  t.rid = 2;

Comme indiqué, il est logique d'inclure des colonnes de time_table dans le résultat, mais c'est mon ajout facultatif.

Vous devez également être clair sur les limites inférieures et supérieures . La convention générale est d'inclure le plus bas et exclure la borne supérieure dans le temps (timestamp ) gammes. D'où mon utilisation de >= et < ci-dessus.

Connexe :

  • Requête SQL sur une série temporelle pour calculer la moyenne
  • Sélectionner une moyenne d'enregistrements regroupés par périodes de 5 minutes

Les performances ne devraient poser pas de problème du tout avec les bons index. Vous avez besoin d'un index (ou PK) sur time_table(rid) et un autre sur record_table(date) .