SQL - объединение всех детей в одну строку - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь переместить данные из базы данных в кадр данных 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 не так много дочерних элементов?

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Вы не можете иметь «столько столбцов, сколько необходимо», потому что число дочерних строк является переменным, и у вас не может быть переменного количества столбцов.Если вы можете определить фиксированное количество дочерних элементов, (скажем, 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 фунта».(Или данные в свойствах объекта child2 1-к-1 в parent_table? Вам следует лучше детализировать значение данных и то, что вы пытаетесь достичь).

0 голосов
/ 25 марта 2019

просто ищите всех самостоятельно и используйте объединение, чтобы присоединиться:

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

Таким образом вы избежите проблемы для Рона или любого, у кого нет регистра в таблице,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...