连接两个可能不包含数据的表

时间:2013-10-24 11:02:59

标签: sql postgresql join

我有两张桌子:

出勤

  • attendance_id_pk
  • student_id
  • is_excused

检查

  • checking_id_pk
  • student_id数据
  • parent_consent

我想将考勤表中的所有数据加入检查表IF:

使用student_id

is_excused = true,parent_consent = false。考勤表可能没有数据。如何在postgresql中执行此操作?

3 个答案:

答案 0 :(得分:1)

我猜你要找的是一个结果集,即使checking表中没有匹配的记录,也会显示来自attendance表的记录。如果是这种情况,那么您必须使用OUTER连接:

SELECT * FROM attendance RIGHT OUTER JOIN checking 
               ON (attendance.student_id = checking.student_id)
WHERE is_excused AND NOT parent_consent

答案 1 :(得分:0)

试试这个:

SELECT * FROM checking c
LEFT JOIN attendance a ON c.student_id = a.student_id AND a.is_excused = "true"
WHERE c.parent_consent = "false";

这将为您提供parent_consent为false的所有检查信息,以及每当您有is_excused = true的出勤信息时。

如果您不希望在没有出席信息时检查信息,您可以执行以下操作:

SELECT * FROM checking c
INNER JOIN attendance a ON c.student_id = a.student_id 
WHERE c.parent_consent = "false"
AND a.is_excused = "true";

修改

如果您不想加入,但要从两个表中获取所有信息,您可以这样做:

SELECT checking_id_pk,student_id,parent_consent FROM checking c
WHERE c.parent_consent = "false"
UNION
SELECT attendance_id_pk,student_id,is_excused FROM attendance a
WHERE a.is_excused = "true";

documentation中查看有关UNION的更多信息:

  

UNION有效地将query2的结果附加到query1的结果   (虽然不能保证这是这个顺序   实际上返回了行)。此外,它消除了重复的行   从结果来看,与DISTINCT一样,除非UNION ALL是   使用

答案 2 :(得分:0)

 SELECT * FROM checking c
LEFT JOIN attendance a ON c.student_id = a.student_id AND a.is_excused = "true"
WHERE c.parent_consent = "false"