如何通过查看表中的其他列来创建列值? SQL
问题描述:
我在表中有三列。如何通过查看表中的其他列来创建列值? 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语句或触发器语句中找到,如果有的话,任何提示将不胜感激。
答
这是很容易使用row_number()
窗口功能,像这样做(在SELECT
):
select
col2 ||'_'|| col3 ||'_'|| row_number() over(partition by col2, col3 order by col2) as col1,
col2,
col3
from t
答
/* 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
答
尝试为
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
为什么不在'SELECT'而不是'INSERT'处生成该值? –
你为什么需要这样做?如果要生成一个唯一的密钥,为什么重复信息而不是添加一个专门为每个col2和col3保存唯一编号的列,并将其包含在唯一密钥中?如果需要以这种方式显示密钥,将三列连接在一起很容易。 – Boneist
您使用的是哪种版本的Oracle数据库? – user75ponic