从2张桌子计数

时间:2019-05-06 13:37:38

标签: sql-server join count

我有2张桌子。

A

Id  Name
1    ab
2    cd
3    eg
4    fg

B

FkID 
1
2
2
1
1
2
4

由于FKID列的B中没有3。我需要在表A中找到计数,而表A中的计数在表B中也具有FKID值。 因此总数应该为3。在我的查询中,左联接后得到7。

2 个答案:

答案 0 :(得分:4)

您不需要加入,可以使用EXISTS进行加入:

select count(*) from a
where exists (
  select 1 from b
  where b.fkid = a.id
)

我相信EXISTS比联接更有效,但是如果需要联接,则必须像这样INNER JOIN

select count(distinct a.id)
from a inner join b
on b.fkid = a.id

答案 1 :(得分:2)

使用COUNT(DISTINCT B.FkId)可获得结果。 COUNT未考虑NULL的值,因此以下查询将起作用。

SELECT COUNT(DISTINCT B.FkId) AS Occurence
FROM TableA A
LEFT JOIN TableB B ON B.FkId = A.Id;

或者也可以通过INNER JOIN实现

SELECT COUNT(DISTINCT B.FkId) AS Occurence
FROM TableA A
INNER JOIN TableB B ON B.FkId = A.Id;

包含示例数据的演示

DECLARE @TableA TABLE  (Id INT, [Name] VARCHAR (2));

INSERT INTO @TableA (Id, [Name]) VALUES
(1, 'ab'),
(2, 'cd'),
(3, 'eg'),
(4, 'fg');

DECLARE @TableB TABLE (FkId INT);

INSERT INTO @TableB (FkId) VALUES
(1),
(2),
(2),
(1),
(1),
(2),
(4);

SELECT COUNT(DISTINCT B.FkId) AS Occurence
FROM @TableA A
LEFT JOIN @TableB B ON B.FkId = A.Id