【问题标题】:Insert/join table on multiple conditions在多个条件下插入/连接表
【发布时间】:2022-01-28 22:42:46
【问题描述】:

我有一张如下所示的表格:

Table A

Version,id
5060586,22285

5074515,22701
5074515,22285

7242751,22701
7242751,22285

我想生成一个名为 groupId 的新密钥,如下所示:

Table A

Version,id,groupId
5060586,22285,1

5074515,22701,2
5074515,22285,2

7242751,22701,2
7242751,22285,2

我希望 groupId 相同,只要不同版本中的 id 相同。因此,例如版本 5074515 和 7242751 具有相同的 id,因此 groupId 将是相同的。如果所有 id 都不相同,则应添加新的 groupId,就像在版本 5060586 中一样。

如何在 SQL oracle 中解决这个特定问题?

【问题讨论】:

  • COUNT(*) OVER (PARTITION BY version,id) AS groupId 已经满足您的情况,具体取决于当前数据。或许,如果您需要更多,您可以尝试更改示例数据集。
  • 是否可以添加自定义 id 作为 groupId?例如 SELECT MAX(PK) + 1 FROM C) + ROWNUM AS PK @BarbarosÖzhan

标签: sql oracle join


【解决方案1】:

一种方法是创建一个唯一值来表示每个版本中的一组 id,然后为 that 的唯一值分配一个 groupid,然后连接回原始数据。

INSERT ALL 
INTO t (version,id) VALUES (5060586,22285)
INTO t (version,id) VALUES (5074515,22701)
INTO t (version,id) VALUES (5074515,22285)
INTO t (version,id) VALUES (7242751,22701)
INTO t (version,id) VALUES (7242751,22285)
SELECT 1 FROM dual;

WITH groups
AS
(
SELECT version
, LISTAGG(id,',') WITHIN GROUP (ORDER BY id) AS group_text
FROM t
GROUP BY version
),
groupids
AS
(
SELECT group_text, ROW_NUMBER() OVER (ORDER BY group_text) AS groupid
FROM groups
GROUP BY group_text
)
SELECT t.*, groupids.groupid
FROM t
    INNER JOIN groups ON t.version = groups.version
    INNER JOIN groupids ON groups.group_text = groupids.group_text;

dbfiddle.uk

【讨论】:

    【解决方案2】:

    你可以使用:

    UPDATE tableA t
    SET group_id = ( SELECT COUNT(DISTINCT id)
                     FROM   TableA x
                     WHERE  x.Version <= t.version );
    

    其中,对于样本数据:

    CREATE TABLE TableA (
      Version  NUMBER,
      id       NUMBER,
      group_id NUMBER
    );
    
    INSERT INTO TableA (Version, id)
    SELECT 5060586,22285 FROM DUAL UNION ALL
    SELECT 5074515,22701 FROM DUAL UNION ALL
    SELECT 5074515,22285 FROM DUAL UNION ALL
    SELECT 7242751,22701 FROM DUAL UNION ALL
    SELECT 7242751,22285 FROM DUAL;
    

    那么,更新之后:

    SELECT * FROM tablea;
    

    输出:

    VERSION ID GROUP_ID
    5060586 22285 1
    5074515 22701 2
    5074515 22285 2
    7242751 22701 2
    7242751 22285 2

    db小提琴here

    【讨论】:

    • 是否可以添加自定义 id 作为 groupId?例如 SELECT MAX(PK) + 1 FROM C) + ROWNUM AS PK
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多