mariadb 如何编写复杂的递归maria db查询

relj7zay  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(151)

我试图编写一个递归查询,用于一个设计很差的旧数据库,因此查询变得相当复杂。
下面是(相关的)表关系x1c 0d1x
因为人们问-这里是这些表的创建代码:

CREATE TABLE CircuitLayout(
    CircuitLayoutID int,
    PRIMARY KEY (CircuitLayoutID)
);

CREATE TABLE LitCircuit (
    LitCircuitID int,
    CircuitLayoutID int,
    PRIMARY KEY (LitCircuitID)
    FOREIGN KEY (CircuitLayoutID) REFERENCES CircuitLayout(CircuitLayoutID)
);

CREATE TABLE CircuitLayoutItem(
    CircuitLayoutItemID int,
    CircuitLayoutID int,
    TableName varchar(255),
    TablePK int,
    PRIMARY KEY (CircuitLayoutItemID)
    FOREIGN KEY (CircuitLayoutID) REFERENCES CircuitLayout(CircuitLayoutID)
);

TableName引用数据库中的另一个表,因此TablePK是指定表中的主键
表名称的有效选项之一是LitCircuit
我正在尝试编写一个查询,该查询将选择一个电路以及与之相关的任何电路
我在理解递归ctes的语法时遇到困难
我的非功能性尝试是这样的:

WITH RECURSIVE carries AS (
    SELECT LitCircuit.LitCircuitID AS recurseList FROM LitCircuit
    JOIN CircuitLayoutItem ON LitCircuit.CircuitLayoutID = CircuitLayoutItem.CircuitLayoutID
    WHERE CircuitLayoutItem.TableName = "LitCircuit" AND CircuitLayoutItem.TablePK IN (00340)
    UNION
    SELECT LitCircuit.LitCircuitID AS CircuitIDs FROM LitCircuit
    JOIN CircuitLayout ON LitCircuit.CircuitLayoutID = CircuitLayoutItem.CircuitLayoutID
    WHERE CircuitLayoutItem.TableName = "LitCircuit" AND CircuitLayoutItem.TablePK IN (SELECT recurseList FROM carries)
) 
SELECT * FROM carries;

00340”是用于测试的虚拟号码,在使用中将被实际列表替换
我尝试做的是基于一个或多个LitCircuitID得到一个LitCircuitID列表-这是锚成员,它工作得很好。
我想做的是把这个结果反馈给它自己。
我不了解如何从锚成员访问数据:我不知道这是一个表,其中的列来自锚中的选择,还是仅仅是一个结果值列表
我不明白是否需要在查询的FROM部分包括“carry”,或者在哪里需要包括
如果我用python写这个函数,我会这样做:

def get_circuits(circuit_list):
    result_list = []
    for layout_item_key, layout_item in CircuitLayoutItem.items():
            if layout_item['TableName'] == "LitCircuit" and layout_item['TablePK'] in circuit_list:
                layout = layout_item['CircuitLayoutID']
                for circuit_key, circuit in LitCircuit.items():
                    if circuit["CircuitLayoutID"] == layout:
                        result_list.append(circuit_key)
    result_list.extend(get_circuits(result_list))
    return result_list

我如何用SQL来表达这一点?

ivqmmu1c

ivqmmu1c1#

丹布莱克的评论让我意识到我错过了什么
这是我想做的:

WITH RECURSIVE carries AS (
    SELECT LitCircuit.LitCircuitID FROM LitCircuit
    JOIN CircuitLayoutItem ON LitCircuit.CircuitLayoutID = CircuitLayoutItem.CircuitLayoutID
    WHERE CircuitLayoutItem.TableName = 'LitCircuit' AND CircuitLayoutItem.TablePK IN (00340)
    UNION ALL
    SELECT LitCircuit.LitCircuitID FROM carries
    JOIN CircuitLayoutItem ON carries.LitCircuitID = CircuitLayoutItem.TablePK
    JOIN LitCircuit ON CircuitLayoutItem.CircuitLayoutID = LitCircuit.CircuitLayoutID
    WHERE CircuitLayoutItem.TableName = 'LitCircuit'
)
SELECT DISTINCT LitCircuitID FROM carries;

我没有把CTE看作是一个查询表--而只是一个结果集,所以我没有意识到必须从它进行SELECT操作--或者通常把它当作一个表来处理。

相关问题