#sql #sqlite
#sql #sqlite
Вопрос:
Я пытаюсь переместить данные из базы данных во фрейм данных pandas. У меня есть данные в нескольких таблицах, которые я хочу объединить.
Я использую SQLAlchemy и отношения между родителем и дочерними элементами.
Я пытаюсь понять, как бы я сделал это в SQL, прежде чем пытаться в SQLAlchemy
Я использую Sqlite в качестве базы данных.
parent_table
ID | Name | Class
1 | Joe | Paladin
2 | Ron | Mage
3 | Sara | Knight
child1
ID | distance | finished | parent_id
1 | 2 miles | yes | 1
2 | 3 miles | yes | 1
3 | 1 miles | yes | 1
4 | 10 miles | no | 2
child2
ID | Weight | height | parent_id
1 | 5 lbs | 5'3 | 1
2 | 10 lbs | 5'5 | 2
Я хочу написать запрос, результатом которого будет все для Joe
(id: 1) в строке.
1 | Joe | Paladin | 2 miles | yes | 3 miles | yes | 1 miles | yes | 5lbs | 5'3
2 | Ron | Mage | 10 miles | no | None | None | None | None | 10lbs | 5'5
3 | Sara | Knight | None | None | None | None | None | None | None | None
Я предполагаю, что мне нужно выполнить объединение, но меня смущает тот факт, что в нем Ron
меньше child1
записей.
Как мне создать таблицу, содержащую столько столбцов, сколько необходимо, и заполняющую пустые, None
когда в некоторых строках parent_table
не так много дочерних элементов?
Комментарии:
1. Для какой платформы базы данных это предназначено?
2. sqlite, только что обновил вопрос
3. Это будет полезно: sqlite.org/lang_with.html .
Ответ №1:
просто найдите каждого самостоятельно и используйте объединение, чтобы присоединиться:
SELECT Name,Class FROM parent_table WHERE ID = 1
UNION
SELECT distance,finished FROM child1 WHERE parent_id = 1
UNION
SELECT weight,height FROM child2 WHERE parent_id =1
Таким образом, вы избегаете проблемы для Ron или любого другого пользователя, у которого нет регистра в таблице,
Ответ №2:
У вас не может быть «Столько столбцов, сколько необходимо», потому что количество дочерних строк является переменным, и у вас не может быть переменного количества столбцов. Если вы можете вычислить фиксированное количество дочерних элементов (скажем, 2), вы можете сделать:
CREATE TABLE
"some_table"
AS
SELECT
"parent_table"."ID",
"parent_table"."Name",
"parent_table"."Class",
"child1_1"."finished" AS "2_miles",
"child1_2"."finished" AS "3_miles"
FROM
"parent_table",
"child1" AS "child1_1",
"child1" AS "child1_2"
WHERE
"child1_1"."parent_id"="parent_table"."id" AND
"child1_2"."parent_id"="parent_table"."id" AND
"child1_1"."distance"='2 miles' AND
"child1_2"."distance"='3 miles'
Вы можете добавлять столбцы из child2 таким же образом. И дочерние подразделы (данные в child1.distance
т.Е.) должны будут перейти к именам столбцов. Но для переменных отношений «один ко многим» вам нужно несколько таблиц. В этом, по сути, и заключается концепция отношений.
Для анализа данных (который вы пытаетесь выполнить, как кажется) вам также понадобятся два набора данных (например, таблицы), потому что 2 измерения (наборы образцов) не коррелированы (т. Е. Расстояния и веса), которые вы можете получить в 2 таблицах. Подумайте о том, что такое «образец» (результат измерения). Это не может быть «объект 1 прошел 2 мили и 4 фунта», потому что «2 мили и 4 фунта» — это не поддающееся измерению событие. Итак, у вас есть 2 разных примера: «объект 1 прошел 2 мили» и «объект 1 прошел 4 фунта». (Или данные в дочернем элементе 2 являются свойствами 1 к 1 объекта в parent_table
? Вам следует более подробно описать значение данных и то, чего вы пытаетесь достичь).