mysql - 多列连接 : Getting additional rows

标签 mysql sql sql-server postgresql join

表 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

我想删除上面结果中的这个坏行(第 3 行)。我想我不能应用排名/分区函数来实现这一点,因为会有很多数据,这些数据可以允许在表 1 中重复(或者我可以吗?)。

你能帮我找到解决方案吗?我想要的结果(理想情况下应该与 table1 的行数相等):

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

关于mysql - 多列连接 : Getting additional rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788248/

相关文章:

mysql_query : Unknown error

mysql - SQL - 如何连接表但保留特定属性的所有值

java - 临时表的对象名称无效

mysql - Double Not Exists SQL 逻辑解释

c# - LINQ-To-Sql 更新 - 性能问题

sql-server - 粒度为 "Block incremental deployment if data loss might occur"

php - 如何使用时间来计算您登录了多少秒

mysql - 数据库设计反馈

php - MySQL:使用 ORDER BY 子句的查询不返回任何内容

sql - 正确的顺序是什么?应该是圆形 -> 类型转换还是类型转换 -> 圆形