我有一个查询,它带回表列表和这些表的计数。
select *
from error
结果
tablename | errorcnt
----------+---------
table1 | 5
table2 | 256
等等。
我需要做一个join
,以便可以从每个表中获得关于已更正示例的记录的另一个计数
select count(fixed)
from table1
所以我的新结果将是
tablename | errorcnt | fixed
----------+----------+------
table1 | 5 | 3
table2 | 256 | 239
等等。
不做光标怎么办?我猜是使用“表名”的子查询。
答案 0 :(得分:0)
您发表的评论:
这是我填充错误表SELECT T.name TableName,i.Rows的方式 来自sys.tables的NumberOfRows T加入sys.sysindexes I ON T.OBJECT_ID = I.ID在哪里显示IN(0,1)按i.Rows DESC,T.name的顺序
表示您正在查找表以及它们各自的索引,这些表是堆(即没有索引)或具有聚集索引的表。我不确定为什么将其归类为“错误”。我希望您只想查找堆。即在indid = 0
的位置。无论如何,我认为“固定”将返回例如现在没有聚簇索引的表。在那种情况下,我不了解架构,认为您已经问过 XY Question
话虽如此,基于其他注释,您可以使用派生表并结合error.tablename
的文字值来防止使用游标。
select
error.tablename
,error.errorcnt
,fixed = coalesce(t1.ct, t2.ct) --add in for each join.
from
error
left join (select count(fixed) as ct from table1 where fixed = 'Y') as t1 on error.tablename = 'table1'
left join (select count(fixed) as ct from table2 where fixed = 'Y') as t2 on error.tablename = 'table2'
--continue the joins for all values in error.tablename
游标的代码更少,而且更动态,但是您要求一种没有游标的方法。
答案 1 :(得分:0)
您可以使用临时表,而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