我在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多行输出中(乘以两个表的行。我的搜索说COALESCE
或LEFT JOIN
应该有效,但COALESCE
不会改变输出。我推测是因为断开连接在0
而不是NULL
。我无法获得与LEFT JOIN
或CASE
一起使用的任何声明。
使问题复杂化,两个表都是从另一个表中解决的。结构的简化示例:
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'
答案 0 :(得分:1)
在表LEFT [OUTER] JOIN
和B
之间使用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;
假设A
和B
之间的参照完整性,我会使用[INNER] JOIN
。