1

我有一个客户提供的数据集,如下所示:(简化)

|ForiegnKey|Code1|Code2|Code3|  
|==========|=====|=====|=====|  
|A         |10   |20   |30   |  
|A         |10   |20   |30   |  
|B         |100  |200  |     |  
|C         |25   |35   |40   |  
|D         |1000 |     |     | 
|E         |     |     |9999 |

对于最终产品,我需要一次将其输入到新的表 1 代码中,如下所示:

|ForiegnKey|Sequence|Code|
|A         |1       |10  |
|A         |2       |20  |
|A         |3       |30  |
|B         |1       |100 |
|C         |1       |25  |
|C         |2       |35  |
|C         |3       |40  |
|D         |1       |1000|
|E         |1       |9999|

对于我的问题,是否有一种简单的方法可以在不涉及使用联合的查询中执行此操作?
我必须根据 ForiegnKey 的值生成序列号(即在 ForiegnKey E 的情况下,即使它在列 Code3 中,我也需要它的序列为 1。)我目前的思路是,如果我可以在不使用联合的情况下将其从表中取出,我可以在同一语句中生成序列 ID。
应跳过 D-2 和 3 以及 E-1 和 2 等空代码值。
我已经开始使用临时表来解决这个问题,但我想我会在这里检查一下,看看是否有更简单的方法。

谢谢

4

1 回答 1

3

与避免 UNIONS 相比,您听起来更有兴趣在一批中获得结果。干得好:

set @last_key = null;
set @seq = 1;
select foreignkey, case when @last_key is null or @last_key != foreignkey then @seq := 1 else @seq := @seq + 1 end as sequence, code, @last_key := foreignkey as foo  from (
  select foreignkey, code1 as code
  from dataset
  where code1 is not null
  union
  select foreignkey, code2
  from dataset
  where code2 is not null
  union
  select foreignkey, code3
  from dataset
  where code3 is not null
  order by 1
) foo;
于 2012-09-17T20:16:12.370 回答