使用链接 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
直接访问要合并的行
我有两个表 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