Jointure externe des tables SQL?

J'ai trois tables dans la database

  1. Table d'activité avec activity_id, activity_type
  2. Table de catégorie avec category_id, category_name
  3. Lier la table avec le mappage entre activity_id et category_id

Je dois écrire une instruction select pour get datatables suivantes:

activity_id, activity_type, Category_name. 

Le problème est qu'une partie de l'activité_id n'a aucune input dans la table de liens.

Si j'écris:

 select a.activity_id, a.activity_type, c.category_name from activity a, category c, link l where a.activity_id = l.activity_id and c.category_id = l.category_id 

alors je ne reçois pas datatables pour les activity_ids qui ne sont pas présents dans la table de liens. J'ai besoin d'get des données pour toutes les activités avec une valeur vide ou nulle comme nom de catégorie pour ceux qui n'ont pas de lien pour category_id.

Je vous prie aider moi avec ceci.

PS. J'utilise MS SQL Server DB

Je crois que vous cherchez une LEFT OUTER JOIN pour votre table d'activité pour returnner toutes les lignes.

 SELECT a.activity_id, a.activity_type, c.category_name FROM activity a LEFT OUTER JOIN link l ON a.activity_id = l.activity_id LEFT OUTER JOIN category c ON c.category_id = l.category_id; 

Vous devez utiliser des jointures explicites appropriées:

 select a.activity_id, a.activity_type, c.category_name from activity a LEFT JOIN link l ON a.activity_id = l.activity_id LEFT JOIN category c ON l.category_id = c.category_id 

Si l'écriture de ce type de logique fait partie de vos responsabilités permanentes, je vous suggère fortement de faire des searchs sur les jointures, y compris les interactions entre les jointures et les clauses where. Les jointures et les clauses where se combinent pour former l'épine dorsale de l'écriture de la requête, quelle que soit la technologie utilisée pour extraire datatables.

Informations de jointure les plus critiques pour comprendre:

  • Left Outer Join: récupère toutes les informations de la table 'left' et tous les loggings qui existent dans la table jointe
  • Inner Join: récupère uniquement les loggings qui existent dans les deux tables
  • Clauses Where: utilisées pour limiter datatables, indépendamment des définitions de jointures internes ou externes.

Dans l'exemple que vous avez publié, la clause where limite vos données globales aux lignes qui existent dans les trois tables. Le rlocation de la clause where par une logique de jointure appropriée fera l'affaire:

 select a.activity_id, a.activity_type, c.category_name from activity a left outer join link l --return all activity rows regardless of whether the link exists on a.activity_id = l.activity_id left outer join category c --return all activity rows regardless of whether the link exists on c.category_id = l.category_id 

Bonne chance!

Qu'en est-il de?

  select a.activity_id, a.activity_type, c.category_name from category c left join link l on c.category_id = l.category_id left join activity a on l.activity_id = a.activity_id 

En fait, la première jointure semble être une inner join , parce que vous n'avez pas mentionné qu'il pourrait y avoir des éléments manquants