Как выполнить обратное заполнение данных из SQL-объединения, только если количество полей равно 1 при обслуживании записей из предыдущих объединений?
У меня есть две таблицы, к которым я могу присоединиться следующим образом:
select * from
(select * from table1 t1
left join table2 t2 on t1.id = t2.id )
Я хочу добавить третью таблицу, в которой я группирую по электронной почте, чтобы заполнить данные в объединении выше, но я хочу, чтобы они были заполнены только для записей, количество сообщений в которых составляет только 1. Если для разных записей существуют дублирующие адреса электронной почты, их следует исключить.
Я пытался этот запрос:
select * from
(select * from table1 t1
left join table2 t2 on t1.id = t2.id
inner join ((select email from table3 group by email
having count(*) =1) t3
on t3.email = t1.emailaddress)
В этот момент, когда я объединяю поле электронной почты с другими в более крупном объединении, я все еще вижу записи, заполненные данными, при этом количество сообщений электронной почты, превышающее 1, будет заполнено.
т.е.
таблица только из LEFT JOIN:
email missing_id
a@a.com
b@b.com
ТОЛЬКО данные table3
email missing_id
a@a.com 1
a@a.com 2
b@b.com 3
Все таблицы, объединенные, где электронная почта встречается только один раз, должны заполнить данные в левом соединении, как показано ниже:
email missing_id
a@a.com
b@b.com 3
1 ответ
Во-первых, ваш первый запрос вернет ошибку почти в любой базе данных, потому что в подзапросе у вас будет два столбца с одинаковым именем. Но я понял.
Если я правильно понимаю, это должно делать то, что вы хотите:
select . . ., t3.id as missing_id
from table1 t1 left join
table2 t2
on t1.id = t2.id left join
(select t3.email, max(t3.id) as id
from table3 t3
group by t3.email
having count(*) = 1
) t3
on t3.email = t1.emailaddress;
Это очень близко к вашему запросу, поэтому я не уверен, что это что-нибудь исправит.