Подсчет из 2 таблиц - PullRequest
1 голос
/ 06 мая 2019

У меня есть 2 таблицы.

A

Id  Name
1    ab
2    cd
3    eg
4    fg

B

FkID 
1
2
2
1
1
2
4

Поскольку в столбце FKID нет 3 в B.Мне нужно найти счет в таблице A, который имеет значение в таблице B, которые также имеют значение в FKID.Таким образом, общее количество должно быть 3. В моем запросе я получаю 7 после левого соединения.

Ответы [ 2 ]

4 голосов
/ 06 мая 2019

Вам не нужно объединение, вы можете сделать это с помощью 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
2 голосов
/ 06 мая 2019

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...