【问题标题】:join two tables that may contain no data连接两个可能不包含数据的表
【发布时间】:2013-10-24 11:02:59
【问题描述】:

我有两张桌子:

出席

  • attendance_id_pk
  • student_id
  • is_excused

检查

  • checking_id_pk
  • student_id
  • 父母同意

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

is_excused = true 和 parent_consent = false 使用 student_id。考勤表中可能没有数据。如何在 postgresql 中做到这一点?

【问题讨论】:

  • 我迷路了。当 is_excused 有值但没有数据时,您想加入它们吗?如果 is_excused 有一个值,那么它不为空!
  • 你想加入他们吗?所以加入他们。问题是什么?您的 JOIN 不起作用吗?

标签: sql postgresql join


【解决方案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

【讨论】:

  • 假设:考勤有两个数据,检查有20个数据。如何可能加入这样做?还是有可能?
  • 是的,始终可以加入。根据两个表中的值,作为连接的结果,您可能会得到 2 X 20 = 40 条记录,或者根本没有记录。连接的结果取决于连接类型、连接条件和表的值。如果其中任何一个发生变化,您可能会得到不同的结果。
【解决方案2】:
 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" 

【讨论】:

  • 假设:考勤有两个数据,检查有20个数据。如何可能加入这样做?还是有可能?
【解决方案3】:

试试这个:

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 是 用过。

【讨论】:

  • 假设:考勤有两个数据,检查有20个数据。如何可能加入这样做?还是有可能?
  • 查看我编辑的查询。我猜你想要所有的信息,但没有加入。您用于 JOIN 的术语是当您想要将信息从一个表匹配到另一个表时。
  • 我尝试了您的示例,但出现错误。错误是“每个 UNION 查询必须具有相同数量的列”
  • 您说您的表格每个有 3 列。我将更新我的查询以命名它们
  • @xyxy。那是你要找的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 2023-03-05
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多