选择缺少行或零值的查询?

时间:2016-01-25 18:52:23

标签: sql postgresql left-join coalesce

我在Postgres一点都不熟练。限制是:我正在使用其他人的数据库,因此不能对表进行任何更改。 Postgres 8.3.3并且不允许升级。从Windows通过pgAdmin III访问数据库。

我遇到一个杀了我的街区。如果关联表中不存在一个表中的值,则根本不会返回任何值。表格B有一个数字列(C_id),它引用表id中的数字列(C),但在表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可能包含0。任何包含id = 0的表中都不存在任何行。

我想输出看起来像:

A.label, C.label

或,B.C_ID = 0

A.label, 'none'

1 个答案:

答案 0 :(得分:1)

在表LEFT [OUTER] JOINB之间使用C。如果找不到'none'中匹配的行,则COALESCE提供C作为默认值。

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.