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 的行相乘)。我的搜索显示 COALESCE
或 LEFT JOIN
应该有效,但 COALESCE
不会更改输出。我想是因为断开连接是在 0
而不是 NULL
。我无法获得任何与 LEFT JOIN
或 CASE
.
一起使用的语句
更复杂的是,两个 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'
在表 B
和 C
之间使用 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;
假设 A
和 B
之间的引用完整性,我对它们使用 [INNER] JOIN
。
我对 Postgres 一点都不熟练。限制是:我正在使用其他人的数据库,因此无法对 tables 进行任何更改。 Postgres 8.3.3 且不允许升级。从 Windows.
通过 pgAdmin III 访问数据库我 运行 进入了一个让我窒息的街区。如果一个 table 中的值在关联的 table 中不存在,我根本得不到 return。 Table B
有一个数字列 (C_id
) 引用 Table C
中的数字列 (id
) 但在 TableB
,所以可以是0
表示为空。 C.id
.
我想要 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 的行相乘)。我的搜索显示 COALESCE
或 LEFT JOIN
应该有效,但 COALESCE
不会更改输出。我想是因为断开连接是在 0
而不是 NULL
。我无法获得任何与 LEFT JOIN
或 CASE
.
更复杂的是,两个 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
.
我想输出如下:
A.label, C.label
或者,B.C_ID = 0
:
A.label, 'none'
在表 B
和 C
之间使用 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;
假设 A
和 B
之间的引用完整性,我对它们使用 [INNER] JOIN
。