2017-06-02 77 views
1

我在表中有三列。如何通过查看表中的其他列来创建列值? SQL

要求:col2和col3的值应为col1。

下面显示了我现在需要更改的表格。

col1 col2 col3 
     AB football 
     AB football 
     ER  driving 
     ER  driving 
     TR  city 
     TR  city 

下面表明,必须改变

col1    col2 col3 
AB_football_1 AB football 
AB_football_2 AB football 
ER_driving_1  ER driving 
ER_driving_2  ER driving 
TR_city_1  TR city 
TR_city_2  TR city 

正如你可以在COL1看表,应采取COL2,把(下划线),然后COL3,把(下划线),然后递增数字根据col2和col3中的值。

这可以在CREATE或SELECT或INSERT语句或触发器语句中找到,如果有的话,任何提示将不胜感激。

+1

为什么不在'SELECT'而不是'INSERT'处生成该值? –

+1

你为什么需要这样做?如果要生成一个唯一的密钥,为什么重复信息而不是添加一个专门为每个col2和col3保存唯一编号的列,并将其包含在唯一密钥中?如果需要以这种方式显示密钥,将三列连接在一起很容易。 – Boneist

+0

您使用的是哪种版本的Oracle数据库? – user75ponic

回答

1

这是很容易使用row_number()窗口功能,像这样做(在SELECT):

select 
col2 ||'_'|| col3 ||'_'|| row_number() over(partition by col2, col3 order by col2) as col1, 
col2, 
col3 
from t 
0
/* table is */ 
col1 col2 col3 
     test 123 

/* Try this query */ 

UPDATE `demo` 
SET `col1` = concat(col2, '_', col3) 

/* Output will be */ 
col1  col2 col3 
test_123 test 123 
1

尝试为

SELECT col2 
     ||'_' 
     ||col3 
     ||'_' 
     ||rank col1, 
     col2, 
     col3 
FROM (SELECT col2, 
       col3, 
       ROW_NUMBER() 
       OVER( 
        PARTITION BY col2, col3 
        ORDER BY col2) rank 
     FROM my_table) 

输出

+---------------+------+----------+ 
|  COL1  | COL2 | COL3 | 
+---------------+------+----------+ 
| AB_football_1 | AB | football | 
| AB_football_2 | AB | football | 
| ER_driving _1 | ER | driving | 
| ER_driving _2 | ER | driving | 
| TR_city _1 | TR | city  | 
| TR_city _2 | TR | city  | 
+---------------+------+----------+ 
+0

尽管我同意这是正确的方法,但OP可能需要考虑是否有可能第3列对于第2列(比如AB | football和AB |棒球)可能不总是相同的,并且可能会想要按两列排序,甚至可能排列第三列(如数据修改字段),这有助于确定多列第3列的哪个记录应该排在第一位。 – HLGEM

相关问题