繁体   English   中英

SQL从每个表租户中获取行数

[英]SQL get row count from every table tenantwise

我正在开发一个多租户应用程序。 大多数表都包含一个列 tenant_id。 我想要特定 tenant_id 的所有表中的行数。

例如,表:-

create table Employee(id integer, name varchar(100), tenantid integer);
insert into Employee(id, name, tenantid) values(1, "Stephan", 64);
insert into Employee(id, name, tenantid) values(2, "Alan", 64);
insert into Employee(id, name, tenantid) values(3, "Charles", 46);

create table Student(id integer, name varchar(100), standard integer, tenantid integer);
insert into Student(id, name, standard, tenantid) values(1, "James", 2, 64);
insert into Student(id, name, standard, tenantid) values(2, "Rony", 4, 64);
insert into Student(id, name, standard, tenantid) values(3, "Steve",6, 64);

create table Teacher(id integer, name varchar(100), subject varchar(100), tenantid integer);
insert into Teacher(id, name, subject, tenantid) values(1, "Alvin", "Science", 46);
insert into Teacher(id, name, subject, tenantid) values(2, "Neil", "Geography", 64);
insert into Teacher(id, name, subject, tenantid) values(3, "Amy", "Mathematics", 46);`

获取 tenantid = 64 的每个表中的行数的示例结果

表名 数数
员工 2个
学生 3个
老师 1个

我如何遍历所有表并查询where tenantid = <tenantid>

使用动态查询。 为每个表动态形成查询并使用string_agg()连接它并使用sp_executesql执行查询

declare @tables varchar(max),
        @tenantid int,
        @sql nvarchar(max)

select @tables = 'Employee,Student,Teacher',
       @tenantid = 64;

select @sql = string_agg('select [TableName] = ''' + value + ''', [Count] = count(*) from ' + quotename(value) + ' where tenantid = @tenantid', ' union all' + char(13) )
from   string_split(@tables, ',')

print @sql

exec sp_executesql @sql, N'@tenantid int', @tenantid

数据库<>小提琴演示

使用联合所有:

SELECT 'Employee' AS "TableName", COUNT(*) AS "Count" FROM Employee WHERE tenantid = 64
UNION ALL
SELECT 'Student' AS "TableName", COUNT(*) AS "Count" FROM Student WHERE tenantid = 64
UNION ALL
SELECT 'Teacher' AS "TableName", COUNT(*) AS "Count" FROM Teacher WHERE tenantid = 64

查看示例(我不确定效率):

CREATE VIEW some_counters_view AS
SELECT 'Employee' AS "TableName", tenantid FROM Employee
UNION ALL
SELECT 'Student' AS "TableName", tenantid FROM Student
UNION ALL
SELECT 'Teacher' AS "TableName", tenantid FROM Teacher
;

SELECT "TableName", COUNT(*) AS "Count"
FROM some_counters_view 
WHERE tenantid = 64
GROUP BY "TableName"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM