我正在尝试在数据库中设置一个视图,我想要查看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'
答案 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 JOIN
。 LEFT 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.从Program
(program_name
='假程序')中获取所有记录,并仅从共享相同personnel_role
的{{1}}中重新记录
2.仅从program_id
中的记录中获取person
与我们刚从person_id
表中获得的记录匹配的记录
3.仅从personnel_role
获取与non_personnel
表中的结果共享program_id的记录。