Запрос не возвращает правильное количество при объединении двух таблиц в SQL Server 2017 - PullRequest
0 голосов
/ 27 января 2020
  • Таблица A имеет 2500 строк
  • Таблица B содержит 12000 строк

Общий столбец между этими двумя таблицами - Email_ID.

Примечание. * Столбец : Email ID может содержать нули в таблице B.

Если я присоединяюсь к этим таблицам, используя этот запрос

Select count(*) 
from A 
left join B on A.Email_ID = B.Email_ID

, это возвращая значение более 2500 записей.

Но я хочу только 2500 записей из таблицы A

Пожалуйста, предложите, как это сделать.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

* вернет общее количество записей независимо от дубликата или пустых значений:

Select count(b.Email_ID) -- if you have a duplicate email ids then use `distinct`
from A left join 
     B 
     on A.Email_ID = B.Email_ID;

Однако вы также можете использовать exists, объединение вернет несколько строк, если в таблице b больше строк соответствует электронный идентификатор доступен в таблице a. Таким образом, счет всегда будет увеличен.

select count(a.Email_ID)
from a 
where exists (select 1 from b where b.Email_ID =  a.Email_ID);
0 голосов
/ 27 января 2020

Если вы хотите только 2500 сотен записей, тогда зачем вы присоединяетесь? То есть они возвращают 2500:

select count(*)
from A;

select count(distinct A.Email_id) 
from A left join
     B
     on A.Email_ID = B.Email_ID;

Если вы действительно хотите, чтобы одна строка возвращалась из B для каждого A, тогда используйте outer apply вместо left join:

select . . .
from a outer apply
     (select top (1) b.*
      from b
      where b.email_id = a.email_id
     ) b;

Возвращает произвольно совпадающую строку из b. Обычно подзапрос будет иметь order by, чтобы обеспечить больший контроль над соответствующей строкой. Например, order by newid() вернет случайную строку.

...