【发布时间】: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 多行输出(将两个表的行相乘)。我的搜索说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'
【问题讨论】:
-
"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