1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
create table a_lastnames(
last_name varchar2(256 char),
lang varchar2(2 char),
constraint pk_lastnames primary key(last_name, lang)
)
organization index;
create table a_firstnames(
first_name varchar2(256 char),
gender char(1),
constraint pk_firstnames primary key(first_name, gender)
)
organization index;
create table t_data(
nsq number(19,0) primary key,
last_name varchar2(256 char),
lang varchar2(2 char),
first_name varchar2(256 char),
gender char(1)
);
insert into a_lastnames(last_name, lang) values('a', 'en');
insert into a_lastnames(last_name, lang) values('b', 'fr');
insert into a_lastnames(last_name, lang) values('c', 'de');
insert into a_lastnames(last_name, lang) values('d', 'it');
insert into a_lastnames(last_name, lang) values('e', 'en');
insert into a_lastnames(last_name, lang) values('f', 'fr');
insert into a_firstnames(first_name, gender) values('I', 'm');
insert into a_firstnames(first_name, gender) values('II', 'f');
insert into a_firstnames(first_name, gender) values('III', 'm');
insert into a_firstnames(first_name, gender) values('IV', 'f');
insert into a_firstnames(first_name, gender) values('V', 'm');
insert into a_firstnames(first_name, gender) values('VI', 'f');
insert into t_data(nsq, last_name, lang, first_name, gender) values(1,'A', 'fr','1', 'm');
insert into t_data(nsq, last_name, lang, first_name, gender) values(2,'B', 'it','2', 'f');
insert into t_data(nsq, last_name, lang, first_name, gender) values(3,'C', 'de','3', 'm');
insert into t_data(nsq, last_name, lang, first_name, gender) values(4,'D', 'en','4', 'm');
insert into t_data(nsq, last_name, lang, first_name, gender) values(5,'E', 'en','5', 'f');
insert into t_data(nsq, last_name, lang, first_name, gender) values(6,'F', 'fr','6', 'm');
insert into t_data(nsq, last_name, lang, first_name, gender) values(7,'G', 'fr','7', 'f');
insert into t_data(nsq, last_name, lang, first_name, gender) values(8,'H', 'fr','8', 'f');
insert into t_data(nsq, last_name, lang, first_name, gender) values(9,'I', 'en','9', 'm');
insert into t_data(nsq, last_name, lang, first_name, gender) values(10,'J', 'de','10', 'f');
insert into t_data(nsq, last_name, lang, first_name, gender) values(11,'K', 'it','11', 'm');
merge INTO t_data d USING
(
WITH x_names AS (
SELECT
row_number() over(partition BY ln.lang, fn.gender order by ln.last_name) AS
id, ln.last_name, ln.lang, fn.first_name, fn.gender
FROM
a_lastnames ln, a_firstnames fn
) ,
x_lang_gender AS (
SELECT DISTINCT
lang, gender
FROM
a_lastnames ln, a_firstnames fn
) ,
all_random_ids AS (
SELECT
nsq,
ROUND(dbms_random.value(1,
( SELECT COUNT(id) FROM x_names x WHERE x.lang = j.lang AND x.gender = j.gender )
) ) AS rid, d.last_name, d.first_name, d.lang, d.gender
FROM
t_data d,
lateral ( SELECT x.lang, x.gender FROM x_lang_gender x WHERE x.lang = d.lang AND x.gender = d.gender ) j
WHERE
d.lang = j.lang AND d.gender = j.gender
)
SELECT
d.nsq, mr.last_name AS last_name, mr.first_name AS first_name, d.gender, d.lang, m.id, m.last_name as new_last_name, m.first_name as new_first_name
FROM
t_data d
JOIN all_random_ids mr ON mr.nsq = d.nsq
LEFT JOIN ( SELECT * FROM x_names ) m ON m.id = mr.rid and m.gender = mr.gender and m.lang = mr.lang
)
nd on (nd.nsq = d.nsq)
WHEN matched THEN
UPDATE
SET
d.last_name = nd.new_last_name,
d.first_name = nd.new_first_name ;
select * from t_data ; |