SQL — Объединение всех дочерних элементов в одну строку

#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 ? Вам следует более подробно описать значение данных и то, чего вы пытаетесь достичь).