Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] SQLite: подтянуть данные из одной табл. в другую даже при отстутствии данных (http://forum.oszone.net/showthread.php?t=349778)

Griboed0ff 11-10-2021 10:25 2968495

SQLite: подтянуть данные из одной табл. в другую даже при отстутствии данных
 
Доброго времени суток! Пытаюсь подтянуть данные одной таблицы в другую, то есть примерно соединить данные двух таблиц по общему столбцу. Все получилось просто, но результат оказался не тот, что нужен. Таблицы 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 2968551

Оказалось все банально и я не понял документацию, эта функция left join

Griboed0ff 11-10-2021 21:13 2968552

Есть такая же ситуация, но тут не получилось.
Есть таблица 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 2968553

удалось только разбить на два запроса и получить нужный результат
Первый:
Код:

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;

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


Время: 23:27.

Время: 23:27.
© OSzone.net 2001-