在SQL中链接多个表时查看两个表中的数据

时间:2014-11-14 19:55:22

标签: sql

我正在尝试在数据库中设置一个视图,我想要查看PERSON表中的所有数据,以及来自PROGRAM表的程序的NON_PERSONNEL表中的三列。这就是我现在正在尝试的,查询运行没有错误,但没有给我任何结果。下面列出的所有4个表都必须得出答案

SELECT 
    person.*, 
    non_personnel.description, 
    non_personnel.amount
FROM 
    person, 
    non_personnel, 
    personnel_role, 
    programs
WHERE 
    person.person_id = personnel_role.person_id
    AND personnel_role.program_id = programs.program_id
    AND programs.program_id = non_personnel.program_id
    AND programs.program_name = 'Fake Program' 

2 个答案:

答案 0 :(得分:2)

你需要使用left join,所以你得到所有人,但如果那个人在其他表中没有记录,那么描述和金额可以为NULL

也使用显式连接语法。

SELECT person.*, non_personnel.description, non_personnel.amount
FROM person
left join personnel_role
ON person.person_id = personnel_role.person_id
left join programs
ON personnel_role.program_id = programs.program_id
AND programs.program_name = 'Fake Program' 
left join non_personnel
ON programs.program_id = non_personnel.program_id

答案 1 :(得分:0)

这实际上取决于您的架构和表中的数据。现在编写它的方式意味着只有在每个表中匹配的记录(根据您的WHERE条件)才会传递到结果集中。

这意味着您必须在program_id's表格中包含您希望在programs表格中的结果中返回的所有non_personnel。他们也必须全部在你的personnel_role表中。并且person_ids表中的所有personnel_role都必须位于person表中。你没有得到任何结果,所以这可能不是你想写的。

我的猜测是你想在这里使用LEFT OUTER JOINLEFT OUTER JOIN说“从一个表中获取所有记录,并且只从连接表中获取满足ON语句中条件的记录”。

因为您想要基于特定程序的信息,所以您可能希望从该表开始:

SELECT person.*,
    non_personnel.description,
    non_personnel.amount
FROM 
    programs
    LEFT OUTER JOIN personnel_role ON
        programs.program_id = personnel_role.program_id
    LEFT OUTER JOIN person ON
        personnel_role.person_id = person.person_id
    LEFT OUTER JOIN non_personnel
        programs.program_id = non_personnel.program_id
WHERE
    programs.program_name = 'Fake Program'

这是一个假设,因为我不知道你的架构是什么或者你的数据是如何构建的,但是我认为这就是你所追求的。

这个FROM条款说的是: 1.从Programprogram_name ='假程序')中获取所有记录,并仅从共享相同personnel_role的{​​{1}}中重新记录 2.仅从program_id中的记录中获取person与我们刚从person_id表中获得的记录匹配的记录 3.仅从personnel_role获取与non_personnel表中的结果共享program_id的记录。