Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用多个子表运行循环SQL_Sql Server_Loops_Tsql_Join - Fatal编程技术网

Sql server 如何使用多个子表运行循环SQL

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)

我很难找到一个查询来提供创建报表所需的多个表中的信息。我正在尝试按属性获取一个列表,其中包含已配置的规则(属性、规则集、规则项),并查看应用这些规则的次数(Propertyrule、Employeeset、Employeerule)

例如,如果我有:

          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

不完全确定游标循环的需要,但假设属性表包含属性的唯一列表(即P.Id>代码>),考虑单个查询加入聚合查询,以查找其他表中的计数。注释表明每个需求都有可能得到满足(对于细微的变化有上限):


不管问题的目标是什么,我强烈建议您不要在这个查询中使用游标,因为它会使获取此报告的速度非常慢。请提供输入数据的示例,以便在您有复杂问题时更容易帮助您。最后一件事,是否允许在查询中使用标量函数?我并不认为这个解决方案需要循环。此外,您不使用循环变量@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