Как обновить разные значения для нескольких записей в Sqlite Android? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть таблица. Я хочу дублировать одни и те же записи несколько раз с одним изменением значений столбца (для времени).Я могу дублировать записи, используя запрос ниже.

insert into acsl_details(userID,aadhar_no 
,date ,time ,in_out 
,deptid ,emptype ,compy_code ,empmode ,name 
,upload_flag ,main_compcode ,utc_date ,utc_time ,time_zone ,latitude ,longitude )
select * from acsl_details;

Теперь у меня есть тысяча дубликатов записей. Теперь я хочу изменить один столбец, который является временем. Мне нужно обновить разное время для всех тысяч записей.,я искал, но не мог понять эти запросы. любая помощь ..

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я полагаю, что следующее будет делать то, что вы просите, то есть обновить столбец времени для 1000 существующих строк со случайно сгенерированным временем в формате чч: мм: сс: -

WITH RECURSIVE newdata(id_of_row,newtime) AS (
    SELECT rowid AS id_of_row , 
         time(strftime('%s', '2000-01-01 00:00:00') +
             abs(random() % (strftime('%s', '2000-01-31 23:59:59') -
                                strftime('%s', '2000-01-01 00:00:00'))
                   ),
                'unixepoch') AS dt
    FROM acsl_details
)
UPDATE acsl_details 
    SET time = (
        SELECT newdata.newtime 
            FROM newdata 
            WHERE newdata.id_of_row = acsl_details.rowid
    );

Код ядра / SQL: -

SELECT rowid AS id_of_row , 
 time(strftime('%s', '2000-01-01 00:00:00') +
            abs(random() % (strftime('%s', '2000-01-31 23:59:59') -
                            strftime('%s', '2000-01-01 00:00:00'))
               ),
            'unixepoch') AS dt
FROM acsl_details

Это извлекает значения rowid из таблицы, добавляя случайно сгенерированное время, приводящее к двум столбцам ( id_of_row и dt ) для каждой строки таблицы acsl_details.

Это, то есть newdata , затем запускает обновления.Обновление выполняется для каждой строки, которая существует в newdata .

Тестирование

Следующее использовалось для создания 100 идентичных строк: -

DROP TABLE IF EXISTS acsl_details;
CREATE TABLE IF NOT EXISTS acsl_details (userID integer, aadhar_no INTEGER, date INTEGER, time INTEGER, in_out INTEGER, deptid INTEGER, compy_code INTEGER, empmode INTEGER, name TEXT, upload_flag INTEGER, main_compcode TEXT, utc_date INTEGER, utc_time, time_zone, latitude REAL, longitude REAL);

WITH RECURSIVE counter(userid,aadhar,date,time,in_out,deptid,compy_code,empmode,name,upload_flag,main_compcode,utc_date,utc_time,time_zone,latitude,longitude) AS (
    SELECT 1,11,'2018-01-01','10:20:00',0,111,56078,25,'FRED',4,'PARTIAL',5000,1324,'Z',123.56,56.234 
    UNION ALL SELECT userid,aadhar,date,time,in_out,deptid,compy_code,empmode,name,upload_flag,main_compcode,utc_date,utc_time,time_zone,latitude,longitude FROM counter LIMIT 100)  
    INSERT INTO  acsl_details SELECT * FROM counter;

SELECT * FROM acsl_details;

Например: -

enter image description here

После запуска кода в соответствии с решением: -

enter image description here

0 голосов
/ 01 июня 2018

Просто укажите нужные значения в select:

insert into acsl_details (userID,aadhar_no, date, time, in_out, 
                          deptid, emptype, compy_code, empmode, name 
                          upload_flag, main_compcode  utc_date, utc_time,
                          time_zone, latitude, longitude
                         )
    select userID, aadhar_no, date,
           <new time value goes here>,
           in_out, 
           deptid, emptype, compy_code, empmode, name 
           upload_flag, main_compcode  utc_date, utc_time,
           time_zone, latitude, longitude                         
    from acsl_details;
...