Postgres连接表:仅返回一个表中的记录,但返回其他表中的值

时间:2015-12-05 02:56:25

标签: postgresql join pgadmin

我有一张约有5,000条记录的表格。我在这个表中创建了三个连接列。每列中的值不是唯一的。我希望通过这三列中的每一列连接到另一个表(按顺序),以返回给定条件的值。

连接表包含多个列。这些列中的三列是连接列,它们对应于第一个表'加入专栏。连接表中的连接列是唯一的。我想从连接表中获取值并将其带到第一个表中的新列。

我有一个代码,我已经从其他建议放在一起,它运行但我在返回表中收到超过800万条记录。我希望表只包含第一个表中的记录。

以下是代码:

CREATE TABLE current_condition_joined AS SELECT
  a.id, a.geom, a.condition_join_1, a.condition_join_2, a.condition_join_3,
  coalesce(b.condition, c.condition2, d.condition3) as current_condition, 
  coalesce(b.ecosite, c.ecosite2, d.ecosite3) as current_ecosite,
  coalesce(b.ecophase, c.ecophase2, d.ecophase3) as current_ecophase,
  coalesce(b.consite, c.consite2, d.consite3) as current_consite,
  coalesce(b.conphase, c.conphase2, d.conphase3) as current_conphase
 FROM current_condition a
 LEFT JOIN boreal_mixedwood_labeled b ON a.condition_join_1 = b.label
 LEFT JOIN boreal_mixedwood_labeled c ON a.condition_join_2 = c.label2
 LEFT JOIN boreal_mixedwood_labeled d ON a.condition_join_3 = d.label3
 WHERE b.condition != 'ERROR' and c.condition2 != 'ERROR';

如果条件不是ERROR,我想从第一个连接中获取值,否则如果条件不是ERROR则来自第二个连接的值,否则是第三个连接的值。

我环顾四周,但是所有的例子都要求稍微不同的东西,所以我不能把它拼凑起来。

这与以下问题不同:Nested Case statement type error (postgres) 问题是关于使嵌套声明工作的问题。这个问题是关于联接的工作原理。两个不同的问题,两个不同的帖子。

2 个答案:

答案 0 :(得分:0)

尝试添加DISTINCT

CREATE TABLE current_condition_joined AS SELECT DISTINCT
  a.id, a.geom, a.condition_join_1, a.condition_join_2, a.condition_join_3,
  coalesce(b.condition, c.condition2, d.condition3) as current_condition, 
  coalesce(b.ecosite, c.ecosite2, d.ecosite3) as current_ecosite,
  coalesce(b.ecophase, c.ecophase2, d.ecophase3) as current_ecophase,
  coalesce(b.consite, c.consite2, d.consite3) as current_consite,
  coalesce(b.conphase, c.conphase2, d.conphase3) as current_conphase
 FROM current_condition a
 LEFT JOIN boreal_mixedwood_labeled b ON a.condition_join_1 = b.label
 LEFT JOIN boreal_mixedwood_labeled c ON a.condition_join_2 = c.label2
 LEFT JOIN boreal_mixedwood_labeled d ON a.condition_join_3 = d.label3
 WHERE b.condition != 'ERROR' and c.condition2 != 'ERROR';

您也可以尝试使用GROUP BY

答案 1 :(得分:0)

您提供的代码是我之前提出的问题:

你打破了,将条件b.condition != 'ERROR'c.condition2 != 'ERROR'移到WHERE子句,这是完全错误的。考虑:

如果行相乘,那么您的连接条件很可能会识别多个匹配的行,相互相乘。如果我仍然拒绝提供boreal_mixedwood_labeled的表格定义,就像我之前为您的问题重复提出的那样,很难诊断出来。