Sql server 如何使用多个子表运行循环SQL
我很难找到一个查询来提供创建报表所需的多个表中的信息。我正在尝试按属性获取一个列表,其中包含已配置的规则(属性、规则集、规则项),并查看应用这些规则的次数(Propertyrule、Employeeset、Employeerule) 例如,如果我有:Sql server 如何使用多个子表运行循环SQL,sql-server,loops,tsql,join,Sql Server,Loops,Tsql,Join,我很难找到一个查询来提供创建报表所需的多个表中的信息。我正在尝试按属性获取一个列表,其中包含已配置的规则(属性、规则集、规则项),并查看应用这些规则的次数(Propertyrule、Employeeset、Employeerule) 例如,如果我有: Table A (property), Table B(Ruleset), Table C(RuleItem), Table D(Propertyrule)
Table A (property),
Table B(Ruleset),
Table C(RuleItem),
Table D(Propertyrule)
Table E(Employeeset)
Table F(Employeerule).
我希望查询从表A的第一行中选择ID,然后根据从表A中提取的ID从表B中选择第一行,然后从表B的第一行中选择ID,并从表B中选择具有相同ID的表C中的所有返回。现在我想计算表B(规则集)的行数在表D、E和F各自的单独列中显示
一旦对C列中的每一行运行该命令,它就会返回到B列并再次循环。重复此操作,直到完成表A中的每一行
以下是我所拥有的,与我所需要的相去甚远:
DECLARE @propid INT
DECLARE c1 CURSOR
FOR
SELECT ID
FROM property --This is the property to copy interfaces into
OPEN c1
FETCH NEXT
FROM c1
INTO @propid
WHILE @@fetch_status = 0
BEGIN
SELECT @propid
,p.name
,rs.propertyid
,rs.name
,rs.ruletypecode
,ri.ruleclasscode
,ri.name
,esr.EmployeeSetID
,pr.rulesetid AS propertyrule
,(
SELECT count(rulesetid)
FROM employeerule
)
FROM ruleset rs
JOIN ruleitem ri ON ri.RuleSetID = rs.id
JOIN property p ON p.id = rs.PropertyID
LEFT JOIN employeesetrule esr ON esr.rulesetid = rs.id
LEFT JOIN propertyrule pr ON pr.RuleSetID = rs.id
LEFT JOIN employeerule er ON er.RuleSetID = rs.id
WHERE rs.id IN (
SELECT rulesetid
FROM employeesetrule
)
OR rs.id IN (
SELECT rulesetid
FROM propertyrule
)
OR rs.id IN (
SELECT rulesetid
FROM employeerule
)
FETCH NEXT
FROM c1
INTO @propid
END
CLOSE c1
DEALLOCATE c1
不完全确定游标循环的需要,但假设
不管问题的目标是什么,我强烈建议您不要在这个查询中使用游标,因为它会使获取此报告的速度非常慢。请提供输入数据的示例,以便在您有复杂问题时更容易帮助您。最后一件事,是否允许在查询中使用标量函数?我并不认为这个解决方案需要循环。此外,您不使用循环变量@propid来过滤查询,只将其作为
SELECT
中的标量使用。所有相关表格中的样本数据可以帮助我们制定解决方案。
SELECT p.id, -- select EACH ID from Table A
, p.name
, rs.propertyid
, rs.name AS ruleset_name
, rs.ruletypecode
, ri.ruleclasscode -- select all the returns from table C
, ri.name AS ruleitem_name
, es_agg.employeeset_count -- count how many rows the table B (Ruleset) appears in tables D in separate column
, pr_agg.propertrule_count -- count how many rows the table B (Ruleset) appears in tables E in separate column
, er_agg.employeerule_count -- count how many rows the table B (Ruleset) appears in tables F in separate column
FROM property p
INNER JOIN ruleset rs
ON p.id = rs.PropertyID -- select EACH row from table B based on the ID pulled from table A
INNER JOIN ruleitem ri
ON ri.RuleSetID = rs.id
INNER JOIN
(SELECT rulesetid, COUNT(*) AS employeeset_count
FROM employeesetrule
GROUP BY rulesetid) es_agg
ON rs.id = es_agg.rulesetid
INNER JOIN
(SELECT rulesetid, COUNT(*) AS propertrule_count
FROM propertyrule
GROUP BY rulesetid) pr_agg
ON rs.id = pr_agg.rulesetid
INNER JOIN
(SELECT rulesetid, COUNT(*) AS employeerule_count
FROM employeerule
GROUP BY rulesetid) er_agg
ON rs.id = er_agg.rulesetid