J'ai trois tables dans la database –
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:
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