Select 查询缺少行或零值?

Select query with missing rows or zero values?

我对 Postgres 一点都不熟练。限制是:我正在使用其他人的数据库,因此无法对 tables 进行任何更改。 Postgres 8.3.3 且不允许升级。从 Windows.

通过 pgAdmin III 访问数据库

我 运行 进入了一个让我窒息的街区。如果一个 table 中的值在关联的 table 中不存在,我根本得不到 return。 Table B 有一个数字列 (C_id) 引用 Table C 中的数字列 (id) 但在 TableB,所以可以是0表示为空。 C.id.

中没有0条记录

我想要 select 来自 Table B 的完整列表,用来自 Table C 的标签替换数值。只要有匹配的数字,这就有效,但如果 B.C_id = 0 我根本没有得到该记录的行。所以 table B 有 66 行,但其中 11 行有 C_id = 0 所以我的输出中只有 55 行。

WHERE B.C_id = C.id 来匹配 tables 似乎排除了不匹配的行 (B.C_id = 0) 但如果我将其排除在外,结果将循环 66 条记录 table 变成 1300 多行输出(将两个 table 的行相乘)。我的搜索显示 COALESCELEFT JOIN 应该有效,但 COALESCE 不会更改输出。我想是因为断开连接是在 0 而不是 NULL。我无法获得任何与 LEFT JOINCASE.

一起使用的语句

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

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

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

的 table 中不存在任何行

我想输出如下:

A.label, C.label

或者,B.C_ID = 0:

A.label, 'none'

在表 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.