2017-06-02 76 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

相關問題