SQL-将所有子级合并为一行

时间:2019-03-24 22:03:40

标签: sql sqlite

我正在尝试将数据从数据库移至熊猫数据框。我有多个要合并的表中的数据。

我正在使用SQLAlchemy以及父母/孩子之间的关系。

在尝试使用SQLAlchemy之前,我试图了解如何在SQL中完成此操作

我正在使用Sqlite作为数据库。

import sphinx.cmd.make_mode as sphinx_build

OUT_DIR = "docs"  # here you have your conf.py etc
build_output = os.path.join(OUT_DIR, "_build")

# build HTML (same as `make html`)
build_html_args = ["html", OUT_DIR, build_output]
sphinx_build.run_make_mode(args=build_html_args)

# build PDF latex (same as `make latexpdf`)
build_pdf_args = ["latexpdf", OUT_DIR, build_output]
sphinx_build.run_make_mode(args=build_pdf_args)

我想编写一个查询,查询结果将是连续conf.py(id:1)的所有内容。

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的{​​{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填充空列?

2 个答案:

答案 0 :(得分:0)

只需自己搜索每个人,然后使用工会即可加入:

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或表中没有寄存器的任何人的问题,

答案 1 :(得分:0)

您不能有“所需的列数”,因为子行数是可变的,并且列数也不能变化。如果您可以算出一定数量的孩子(例如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张桌子。考虑一下什么是“样本”(测量结果)。它不能是“实体1完成2英里4磅”,因为“ 2英里4磅”这不是可衡量的事件。因此,您有2个不同的样本:“实体1完成2英里”和“实体1完成4磅”。 (还是parent_table中实体的child2 1-to-1属性中的数据?您应该更好地详细说明数据的含义以及您要实现的目标)。