2013-08-29 5 views
0

Je me rends compte que le problème auquel je fais face n'est pas une science de fusée, mais je n'ai trouvé aucune information sur la façon de résoudre ce problème.Instruction SQL Select - plusieurs tables permettent des valeurs nulles

J'ai plusieurs tables dans ma base de données (PSQL) Je veux créer une requête select pour créer une fonction de rapport pour mon application.

Voici ma question:

select 
    s.id, s.name, st.name, p.firstname || ' ' || p.lastname, 
    f.name, f.store_date, bdt.name, bd.comment 
from 
    system s, systemstatus st, role w, person p, file f, 
    documenttype bdt, document bd 
where 
    w.system_id = s.id and 
    p.id = w.person_id and 
    st.id = s.status_id and 
    bd.system_id = s.id and 
    bd.file_id = f.id and 
    bd.type_id = bdt.id and 
    bd.role_id = w.id; 

requête fonctionne 300 je reçois des lignes entièrement remplis avec des valeurs que je recherche. Le problème est que j'ai environ 1000 lignes dans System Table. Il est possible qu'il n'y ait aucun Person ou Document qui pourrait être lié avec System particulier.

Je voudrais voir toutes les lignes qui sont dans ma table System (je veux dire 1000), et quand je ne peux pas créer un lien Person ou Document avec System Je veux que le champ soit nul (il est maintenant non représentée à all)

+0

[Mauvaises habitudes à lancer: en utilisant les anciens JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - cette ancienne liste * de styles de tables * séparés par des virgules a été remplacée par la syntaxe * proper * ANSI 'JOIN' dans la norme ANSI - ** 92 ** SQL Standard (** plus de 20 ans ** il ya quelque temps) et son utilisation est déconseillée –

Répondre

3

partie principale de la réponse est - vous avez besoin left outer join.
parties supplémentaires de la réponse - utiliser ANSI join syntax et le format de vos requêtes:

select 
    s.id, s.name, st.name, p.firstname || ' ' || p.lastname, f.name, 
    f.store_date, bdt.name, bd.comment 
from system as s 
    left outer join systemstatus as st on st.id= s.status_id 
    left outer join role as w on w.system_id = s.id 
    left outer join person as p on p.id = w.person_id 
    left outer join document as bd on bd.system_id = s.id and bd.role_id = w.id 
    left outer join documenttype as bdt on bdt.id = bd.type_id 
    left outer join file as f on f.id = bd.file_id 

Rappelez-vous toujours que quelqu'un va lire votre code jour (peut-être ce sera l'avenir vous :)) - compte donc lisibilité!

0

Vous connectez vos tables dans la requête via la clause "where", qui est égale à la jointure interne. Au lieu de cela, vous devez joindre à gauche et personne tables document à la table système, .: par exemple

select * 
from system s 
left join role w on w.system_id = s.id 
left join person p on p.id = w.person_id 
+0

Je vais essayer ceci et vous tenir au courant. Merci pour vos conseils! – Mithrand1r

Questions connexes