PDA

Показать полную графическую версию : [решено] SQLite: подтянуть данные из одной табл. в другую даже при отстутствии данных


Griboed0ff
11-10-2021, 10:25
Доброго времени суток! Пытаюсь подтянуть данные одной таблицы в другую, то есть примерно соединить данные двух таблиц по общему столбцу. Все получилось просто, но результат оказался не тот, что нужен. Таблицы all_pc_result и all_users_result, общий столбец WorkstationName. В результате получилась таблица с пересечениями. Но моя цель, не только пересечения, а именно к all_pc_result подтянуть данные из all_users_result, даже если в all_users_result нет данных. Пример: all_pc_result содержит 11775 записей, а all_users_result содержит 9020 записей, в итоге пересечений получилось 8806. А требуется, чтобы новая таблица содержала 11775 записей и там где данных в таблице all_users_result для этого WorkstationName не нашлось, поля просто остались пустыми. То есть я не хочу терять данные только из-за того, что в другой таблице не нашлось чего присоединить.
"CREATE TABLE IF NOT EXISTS all_pc_users AS
select Data,
Ping,
Region,
B_S_TT,
System_Unit_Name,
System_Unit_Manufacturer,
System_Unit_Model,
Motherboard_SN,
Adapter_IPv4,
Adapter_Mac,
Adapter_Name,
Adapter_Type,
Adapter_Speed,
Monitor_1_model,
Monitor_1_SN,
Monitor_2_model,
Monitor_2_SN,
Router_Manufacturer,
Router_Model,
Router_SN,
Processor,
DDRx,
kolichestvo_Slots_all,
kolichestvo_Slots_free,
PhysicalMemory_all,
Slot_1_size,
Slot_1_speed,
Slot_1_manufacturer,
Slot_2_size,
Slot_2_speed,
Slot_2_manufacturer,
Slot_3_size,
Slot_3_speed,
Slot_3_manufacturer,
Slot_4_size,
Slot_4_speed,
Slot_4_manufacturer,
OS,
x64_x86,
disk_1_name,
disk_1_size,
disk_1_type,
disk_2_name,
disk_2_size,
disk_2_type,
disk_3_name,
disk_3_size,
disk_3_type,
disk_4_name,
disk_4_size,
disk_4_type,
shk,
webcam,
Unix_Time,
lastLogonTimeStamp,
whenChanged,
all_logon,
user_1,
user_1_logon,
user_2,
user_2_logon,
user_3,
user_3_logon
from all_pc_result
join all_users_result
on all_pc_result.System_Unit_Name = LOWER(all_users_result.WorkstationName);"

Griboed0ff
11-10-2021, 20:53
Оказалось все банально и я не понял документацию, эта функция left join

Griboed0ff
11-10-2021, 21:13
Есть такая же ситуация, но тут не получилось.
Есть таблица AD_list к ней подтягиваю данные из all_pc, общий столбец System_Unit_Name. CREATE TABLE IF NOT EXISTS all_pc_result_test AS
SELECT *
FROM AD_list
right join all_pc USING(System_Unit_Name)
WHERE Ping <> 'No'
GROUP BY System_Unit_Name HAVING max(printf('%s-%s-%s', substr(Data, length(Data) + 1, -4), substr(Data, instr(Data, '.') + 1, 2), substr(Data, 1, 2)));
На выходе получаю 11700 записей, но AD_list содержала 13800 записей, значит я получил не тот результат.
Я подозреваю, что это из-за GROUP BY, но там важные нужные мне условия выборки из таблицы all_pc. Как быть?

Griboed0ff
11-10-2021, 21:31
удалось только разбить на два запроса и получить нужный результат
Первый:CREATE TABLE IF NOT EXISTS all_pc_result22 AS
SELECT *
FROM all_pc
WHERE Ping <> 'No'
GROUP BY System_Unit_Name HAVING max(printf('%s-%s-%s', substr(Data, length(Data) + 1, -4), substr(Data, instr(Data, '.') + 1, 2), substr(Data, 1, 2)));
Второй:CREATE TABLE IF NOT EXISTS all_pc_result_test AS
SELECT *
FROM AD_list
left join all_pc_result22
on AD_list.System_Unit_Name = all_pc_result22.System_Unit_Name;
Как сделать одним запросом пока непонятно..

Разобрался: CREATE TABLE IF NOT EXISTS all_pc_result_test AS
SELECT *
FROM AD_list
left join (SELECT *
FROM all_pc
WHERE Ping <> 'No'
GROUP BY System_Unit_Name HAVING max(printf('%s-%s-%s', substr(Data, length(Data) + 1, -4), substr(Data, instr(Data, '.') + 1, 2), substr(Data, 1, 2)))) AS all_pc_result22
on AD_list.System_Unit_Name = all_pc_result22.System_Unit_Name;

Не знаю почему, но днем не получалось, а вечером вдруг прояснилось и получилось.




© OSzone.net 2001-2012