我试图编写一个递归查询,用于一个设计很差的旧数据库,因此查询变得相当复杂。
下面是(相关的)表关系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来表达这一点?
1条答案
按热度按时间ivqmmu1c1#
丹布莱克的评论让我意识到我错过了什么
这是我想做的:
我没有把CTE看作是一个查询表--而只是一个结果集,所以我没有意识到必须从它进行SELECT操作--或者通常把它当作一个表来处理。