使用链接 table 的组值 (MIN) 的结果更新列值

Update column values with result from group values (MIN) of linked table

我有两个表 Table 1(主)和 Table 2,与 T1 连接。

I need to delete double entries in Table 1. TO do that before any delete in T1 I must delete or update the data in T2.

The option chosen is to update T2 data to point with entries not to be deleted in T1.

SQL 问题:

我有以下分组:

SELECT min(t1.id) minid
                ,max(t1.id) maxid
                ,t1.t1_value t1valor
                ,t1.group_id grupo
                ,t1.date_begin
                ,t1.date_end
                ,count(*)
            FROM rs2qtt1 t1
            WHERE t1.t1_value LIKE '%B0%'
            GROUP BY t1.t1_value
                ,t1.group_id
                ,t1.date_begin
                ,t1.date_end
            HAVING count(*) > 1
            ORDER BY count(*) DESC
                ,t1.t1_value
                ,t1.group_id
                ,t1.date_begin

如果可能的话,我想做类似的事情来避免 PL/SQL。

UPDATE rs2qtt2 t2
SET t2.rg_id = minid
WHERE t2.rg_id IN ( 
        SELECT maxid max2
        FROM (
            SELECT min(t1.id) minid
                ,max(t1.id) maxid
                ,t1.t1_value t1valor
                ,t1.group_id grupo
                ,t1.date_begin
                ,t1.date_end
                ,count(*)
            FROM rs2qtt1 t1
            WHERE t1.t1_value LIKE '%B0%'
            GROUP BY t1.t1_value
                ,t1.group_id
                ,t1.date_begin
                ,t1.date_end
            HAVING count(*) > 1
            ORDER BY count(*) DESC
                ,t1.t1_value
                ,t1.group_id
                ,t1.date_begin  
            )
        );  

但是显然set语句中的minid是不可见的

我认为这可以使用合并来完成:

MERGE INTO rs2qtt2 t2
USING (SELECT min(t1.id) minid
                ,max(t1.id) maxid
                ,t1.t1_value t1valor
                ,t1.group_id grupo
                ,t1.date_begin
                ,t1.date_end
                ,count(*)
            FROM rs2qtt1 t1
            WHERE t1.t1_value LIKE '%B0%'
            GROUP BY t1.t1_value
                ,t1.group_id
                ,t1.date_begin
                ,t1.date_end
            HAVING count(*) > 1
            ORDER BY count(*) DESC
                ,t1.t1_value
                ,t1.group_id
                ,t1.date_begin) t1
ON (t1.maxid = t2.rg_id)
WHEN MATCHED THEN UPDATE SET t2.rg_id = t1.minid;

您可以使用 rs2qtt2 保存的 rowid 在查询中准备所需的值,然后将其用作 merge 查询的源数据,例如

merge into rs2qtt2 dst using (
    select t2.rowid row_id, t1.minid new_id
    from (
        SELECT min(t1.id) minid, max(t1.id) maxid
        FROM rs2qtt1 t1
        WHERE t1.t1_value LIKE '%B0%'
        GROUP BY t1.t1_value, t1.group_id, t1.date_begin, t1.date_end
        HAVING count(*) > 1
    ) t1 inner join rs2qtt2 t2 on (t2.rg_id = t1.maxid)
) src
on (dst.rowid = src.row_id)
when matched then update set dst.rg_id = src.new_id;

这应该有助于避免 ORA-38104 并且应该通过 rowid

直接访问要合并的行