【问题标题】:How to create column values by looking at other columns in a table? SQL如何通过查看表中的其他列来创建列值? SQL
【发布时间】:2023-04-07 22:09:02
【问题描述】:

我在一个表中有三列。

要求: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,put(下划线),然后 col3,put(下划线),然后根据 col2 和 col3 中的值递增数字。

这可以在 CREATE 或 SELECT 或 INSERT 语句或 Trigger 语句中处理,如果有任何提示将不胜感激。

【问题讨论】:

  • 为什么不在SELECT而不是INSERT生成该值?
  • 为什么需要这样做?如果要生成唯一键,为什么要重复信息而不是为每个 col2 和 col3 添加一个包含唯一编号的列,并将其包含在唯一键中?如果您需要以这种方式显示键,将三列连接在一起很容易。
  • 您使用哪个版本的Oracle数据库?
  • @OtoShavadze,是的,我会这样做。有什么想法吗?
  • 寻找row_num函数

标签: sql oracle


【解决方案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     |
+---------------+------+----------+

【讨论】:

  • 虽然我同意这是正确的方法,但 OP 可能需要考虑是否有可能第 3 列对于每列 2 可能并不总是相同(例如 AB|football 和 AB|baseball)并且可能希望按两列甚至第三列(如数据修改字段)进行排序,这有助于确定多列 3 重复中的哪条记录应该首先出现。
【解决方案2】:
/* 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

【讨论】:

    【解决方案3】:

    使用row_number() 窗口函数很容易做到(SELECT),如下所示:

    select  
    col2 ||'_'|| col3 ||'_'|| row_number() over(partition by col2, col3 order by col2) as col1, 
    col2, 
    col3
    from t
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2019-06-28
      • 2012-08-02
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多