首页 > 解决方案 > 如何从表名查询中获取选择计数(x)

问题描述

我有一个查询,它带回了一个表列表和这些表的计数。

select *
from error

结果是

tablename | errorcnt
----------+---------
table1    |        5
table2    |      256

等等。
我需要这样做,join以便我可以从每个表中获取关于已更正的记录的另一个计数示例

select count(fixed)
from table1

所以我的新结果是

tablename | errorcnt | fixed
----------+----------+------
table1    |        5 |     3
table2    |      256 |   239

等等。
不做游标我怎么办?我猜想使用'tablename'的子查询。

标签: sqlsql-servertsql

解决方案


你可以使用临时表和while循环避免游标

DECLARE
    @SQLQuery   NVARCHAR(100),
    @Tablename  VARCHAR(100)

CREATE TABLE
    #error
(
    tablename   VARCHAR(100),
    errorcnt    INT
)

CREATE TABLE
    #Table1
(
    fixed       INT
)

CREATE TABLE
    #Table2
(
    fixed       INT
)

CREATE TABLE
    #Temp_fixed
(
    fixed       INT
)

INSERT INTO
    #error
VALUES
(
    '#Table1',
    5
),
(
    '#Table2',
    256
)

INSERT INTO
    #Table1
VALUES
(
    3
)

INSERT INTO
    #Table2
VALUES
(
    239
)

SELECT
    tablename,
    errorcnt,
    -1 AS fixed
INTO
    #Temp_error
FROM
    #error

WHILE EXISTS(SELECT TOP 1 1 FROM #Temp_error WHERE fixed = -1)
    BEGIN

        SET
            @Tablename = (SELECT TOP 1 tablename FROM #Temp_error WHERE fixed = -1)
        SET
            -- @SQLQuery = 'SELECT COUNT(fixed) FROM ' + @Tablename
            @SQLQuery = 'SELECT SUM(fixed) FROM ' + @Tablename

        INSERT INTO
            #Temp_fixed
        (
            fixed
        )
        EXECUTE
            sp_executesql
                @SQLQuery

        UPDATE
            #Temp_error
        SET
            fixed = ISNULL((SELECT TOP 1 fixed FROM #Temp_fixed), 0)
        WHERE
            tablename = @Tablename

        TRUNCATE TABLE #Temp_fixed

    END

SELECT
    tablename,
    errorcnt,
    fixed
FROM
    #Temp_error


DROP TABLE #error
DROP TABLE #Table1
DROP TABLE #Table2
DROP TABLE #Temp_error
DROP TABLE #Temp_fixed

推荐阅读