表1:

timezone         some_data       joincol2

America/Denver   22/04/16 7:23   abd
America/Chicago  22/04/16 7:23   abc
America/Adak     22/04/16 7:23   abc
America/Adak     22/04/16 7:23   abe

这是一个事实表,数据来自源。
表2:
timezone         Value_needed      joincol2

America/Chicago    0               NULL
America/Adak      -5               NULL
America/Adak      -4               abc
America/Denver    -2               NULL

这是一个静态表。
期望结果:将这些表连接到timezonejoincol2并从表2中获取value_needed列,在某种程度上,当joincol2匹配时,相应的值否则为时区的空值。
我写的问题:
SELECT table1.timezone,
       table1.joincol2 AS left_joincol2,
       table2.joincol2 AS right_joincol2,
       value_needed
FROM   table1
       LEFT JOIN table2
              ON ( table1.joincol2 = table2.joincol2
                    OR table2.joincol2 IS NULL )
                 AND table2.timezone = table1.timezone

我得到的结果是:
timezone        left_joincol2   right_joincol2  value   some_data

America/Denver  abd                             -2      22/04/16 7:23
America/Chicago abc                              0      22/04/16 7:23
America/Adak    abc                             -5      22/04/16 7:23 --Bad Row
America/Adak    abc             abc             -4      22/04/16 7:23
America/Adak    abe                             -5      22/04/16 7:23

我想删除上面结果中的坏行(第三行)。我想我不能应用rank/partition函数来实现这一点,因为会有很多数据,这些数据可以在表1中重复(或者我可以?).
你能帮我找到解决办法吗?我想要的结果(理想情况下应该与表1的行数相等):
timezone        left_joincol2   right_joincol2  value   some_data

America/Denver  abd                             -2      22/04/16 7:23
America/Chicago abc                              0      22/04/16 7:23
America/Adak    abc             abc             -4      22/04/16 7:23
America/Adak    abe                             -5      22/04/16 7:23

我完全控制系统。可以添加主键或任何您建议的内容。
如果我错过了一些信息,请随时询问。

最佳答案

可以将静态表视为两个表,一个在“joincol2”上联接,另一个在joincol2为空时联接。然后将两个值合并在一起,首先合并所需的值,这样它在出现时就赢了。类似于:

select t1.*,
coalesce(t2.value_needed, t2_default.value_needed) as value_needed
from table1 t1
left join table2 t2
  on t1.timezone = t2.timezone
  and t1.joincol2 = t2.joincol2
left join table2 t2_default
  on t1.timezone = t2_default.timezone
  and t2_default.joincol2 is null

09-25 15:15