【问题标题】:Select query with missing rows or zero values?选择缺少行或零值的查询?
【发布时间】:2016-05-02 04:54:17
【问题描述】:

我一点也不擅长 Postgres。限制是:我正在使用其他人的数据库,因此不能对表进行更改。 Postgres 8.3.3,不允许升级。在 Windows 中通过 pgAdmin III 访问数据库。

我遇到了一个让我难受的街区。如果关联表中不存在一个表中的值,则我根本不会得到任何回报。表B 有一个数字列(C_id),它引用表C 中的一个数字列(id),但在表B 中是可选的,所以它可以是0 来表示为空。 C.id中没有0记录。

我想从表B 中选择一个完整的列表,用表C 中的标签替换数值。只要有匹配的数字,这就会起作用,但如果 B.C_id = 0 我根本没有得到该记录的任何行。所以表 B 有 66 行,但其中 11 行有 C_id = 0,所以我的输出中只有 55 行。

WHERE B.C_id = C.id 匹配表似乎排除了不匹配的行 (B.C_id = 0) 但如果我将其省略,结果会将 66 条记录表循环成 1300 多行输出(将两个表的行相乘)。我的搜索说COALESCELEFT JOIN 应该可以工作,但COALESCE 不会改变输出。我猜是因为断开连接是在0 而不是NULL。我无法获得与LEFT JOINCASE 一起使用的任何语句。

更复杂的是,这两个表都是从另一个表中寻址的。结构的简化示例:

Table A: (id, label, B_id)
Table B: (id, label, C_id)
Table C: (id, label)

所有id 字段都是数字,标签是文本。 A.B_id 中的所有记录都包含非零数字,但 B.C_id 可能包含 0id = 0 的任何表中都不存在行。

我想输出如下:

A.label, C.label

或者,B.C_ID = 0:

A.label, 'none'

【问题讨论】:

  • "Postgres 8.3.3 并且不允许升级" - 祝你好运。 8.3.3.甚至不是最新的 8.3 版本。您在 8.3 行中缺少 5 年的错误修正。如果我理解正确,您正在寻找一个简单的外部连接。
  • 请展示您尝试过的内容。
  • 嗯,是的,我指出我被困在 8.3.3 上,所以人们不会浪费时间告诉我升级。我将对 OUTER JOIN 做更多的研究。我已经看到很多类似的请求,但大多数都是使用 LEFT JOIN(我无法开始工作)或 COALESCE 解决的,这似乎没有效果,至少在我的情况下。
  • 我尝试 LEFT JOIN 时得到的错误是:错误:对表“B”的 FROM 子句条目的无效引用 SQL 状态:42P01 提示:表“B”有一个条目,但是不能从查询的这一部分引用它。字符:375
  • 我试过的命令是:LEFT JOIN C ON (C.id = B.C_id)

标签: sql postgresql left-join coalesce


【解决方案1】:

在表BC 之间使用LEFT [OUTER] JOIN。如果在C 中没有找到匹配的行,则COALESCE 默认提供'none'

SELECT A.label AS a_label, COALESCE(C.label, 'none') AS c_label
FROM      A
JOIN      B ON B.id = A.B_id
LEFT JOIN C ON C.id = B.C_id;

假设AB 之间的引用完整性我使用[INNER] JOIN 来表示。

Details for joins in the manual.

【讨论】:

  • 太棒了!感谢您花时间教育一位老计算机。我到处都在“左加入”,而 COALESCE 正在按我的意愿工作。我正在朝着我想要的方向前进。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多