Если я правильно понимаю, похоже, что вы пытаетесь присоединиться к столбцу sub
, если он совпадает.Если на sub
нет совпадений, то вы хотите, чтобы он выбрал «первую» строку для этого acctnum
.Правильно ли это?
Если это так, вам нужно будет выполнить левое соединение при полном совпадении, а затем выполнить другое левое соединение с оператором select
, который определяет division
, который соответствует наименьшему sub
значение для этого acctnum
.Функция row_number()
может помочь вам в этом, например:
select
t1.acctnum,
t1.sub,
t1.fname,
t1.lname,
t1.phone,
isnull(t2_match.division, t2_first.division) as division
from table1 t1
left join table2 t2_match on t2_match.acctnum = t1.acctnum and t2_match.sub = t1.sub
left join
(
select
acctnum,
sub,
division,
row_number() over (partition by acctnum order by sub) as rownum
from table2
) t2_first on t2_first.acctnum = t1.acctnum
РЕДАКТИРОВАТЬ
Если вас не волнует , который записав, что вы вернетесь из таблицы 2, когда соответствующего сабвуфера не существует, вы можете объединить два разных запроса (один, который соответствует сабвуферу, а другой - с делением min или max) с union
.
select
t1.acctnum,
t1.sub,
t1.fname,
t1.lname,
t1.phone,
t2.division
from table1 t1
join table2 t2 on t2.acctnum = t1.acctnum and t2.sub = t1.sub
union
select
t1.acctnum,
t1.sub,
t1.fname,
t1.lname,
t1.phone,
min(t2.division)
from table1 t1
join table2 t2 on t2.acctnum = t1.acctnum
left join table2 t2_match on t2_match.acctnum = t1.acctnum and t2_match.sub = t1.sub
where t2_match.acctnum is null
Лично я не нахожу синтаксис union
более убедительным, и теперь вам нужно поддерживать запрос в двух местах.По этой причине я бы предпочел подход row_number()
.