sql—获取多个表的每个租户的行数

gdx19jrr  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(334)

假设我有两张table: Tenants 以及 Wargles . Wargles 有外键指向 Tenants 打电话 TenantId . 如果我想得到每个租户的wargle数量,我可以这样做:

  1. SELECT t.Id as TenantId, count(w.Id) as WargleCount
  2. FROM Tenants t
  3. JOIN Wargles w ON w.TenantId = t.Id
  4. GROUP BY t.Id

现在,假设我还有一张table, Fiddles ,作为 Wargles 有一个fk指向 Tenants . 如何向上面的查询中添加另一列,以便获得每个租户的wargle数和fiddle数?
我试过这个:

  1. SELECT t.Id as TenantId, count(w.Id) as WargleCount, count(f.Id) as FiddleCount
  2. FROM Tenants t
  3. JOIN Wargles w ON w.TenantId = t.Id
  4. JOIN Fiddles f ON f.TenantId = t.Id
  5. GROUP BY t.Id

但这行不通,因为它将为warglecount和fiddlecount提供相同的数字,这两个表中的行的乘积。

j9per5c4

j9per5c41#

使用两个子选择

  1. SELECT t.Id as TenantId,
  2. (SELECT Count(1) FROM Fiddles F WHERE F.TenantId = T.Id) as FiddleCount,
  3. (SELECT Count(1) FROM Wargles W WHERE W.TenantId = T.Id) as WargleCount
  4. FROM Tenants t
uxh89sit

uxh89sit2#

最有效的方法可能是使用相关子查询:

  1. SELECT t.Id as TenantId,
  2. (SELECT COUNT(*)
  3. FROM Wargles w
  4. WHERE w.TenantId = t.Id
  5. ) as WargleCount, count(f.Id) as FiddleCount
  6. (SELECT COUNT(*)
  7. FROM Fiddles f
  8. WHERE f.TenantId = t.Id
  9. ) as FiddleCount
  10. FROM Tenants t;

特别是,这可以利用上的索引 Wargles(TenantId) 以及 Fiddles(TenantId) .

2uluyalo

2uluyalo3#

在您的情况下,作为可扩展的解决方案,我建议使用标量函数。

  1. /* SAMPLE DATA ARRANGE */
  2. CREATE TABLE Tenants (Id INT, Title NVARCHAR(5)) ; INSERT INTO Tenants VALUES (1, 'A'), (2, 'B') , (3, 'C');
  3. CREATE TABLE Wargles (Id INT,TenantId INT);INSERT INTO Wargles VALUES (1, 1), (2, 1) , (3, 1) , (4, 2), (5, 2) , (6, 1), (7, 3) , (8, 3);
  4. CREATE TABLE Fiddles (Id INT,TenantId INT);INSERT INTO Fiddles VALUES (1, 1), (2, 1) , (3, 1) , (4, 2), (5, 2) , (6, 2), (7, 3) , (8, 2);

函数

  1. /*NEEDED CODE*/
  2. CREATE FUNCTION dbo.ufnGetTenantsNo ( @Id AS INT , @Tb AS INT)
  3. RETURNS INT
  4. AS
  5. BEGIN
  6. DECLARE @Result INT = 0;
  7. IF (@TB = 1)
  8. SELECT @Result = COUNT(*)
  9. FROM Wargles
  10. WHERE TenantId = @Id
  11. ELSE
  12. SELECT @Result = COUNT(*)
  13. FROM Fiddles
  14. WHERE TenantId = @Id
  15. RETURN @Result
  16. END
  17. GO

select语句

  1. SELECT Id AS TenantId
  2. ,dbo.ufnGetTenantsNo(Id, 1) AS WargleCount
  3. ,dbo.ufnGetTenantsNo(Id, 2) AS FiddleCount
  4. FROM Tenants
展开查看全部

相关问题