Если вы хотите одну строку для таблицы A, то используйте outer apply
:
SELECT A.*,
B.column_name
FROM Table_A a OUTER APPLY
(SELECT TOP (1) b.*
FROM Table_B b
WHERE A.date = B.date AND A.isin = B.isin
ORDER BY ? -- you can specify *which* row you want when there are duplicates
) b;
OUTER APPLY
, реализующее боковое соединение. TOP (1)
гарантирует, что возвращается не более одной строки. OUTER
(в отличие от CROSS
) гарантирует, что ничего не будет отфильтровано. В этом случае вы также можете сформулировать это как коррелированный подзапрос.
Все это говорит о том, что ваши данные не соответствуют вашим ожиданиям. Вы должны выяснить, откуда берутся дубликаты. Место для начала:
select b.date, b.isin, count(*)
from tableb b
group by b.date, b.isin
having count(*) >= 2;
Это покажет вам дубликаты, чтобы вы могли выяснить, что с ними делать.