如何仅在字段计数等于 1 的情况下回填来自 sql 的数据,同时维护以前连接的记录?
How to back fill data from a sql join only where count of field is equal to 1 while maintaning records from previous joins?
我有两个 table 我可以这样加入:
select * from
(select * from table1 t1
left join table2 t2 on t1.id = t2.id )
我想在我按电子邮件分组的地方添加第三个 table,以回填上面连接中的数据,但我只想回填电子邮件计数仅为 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。
即
table 仅来自 LEFT JOIN:
email missing_id
a@a.com
b@b.com
table仅 3 个数据
email missing_id
a@a.com 1
a@a.com 2
b@b.com 3
所有 tables 加入其中电子邮件只出现一次,应该像这样在左侧加入中回填数据:
email missing_id
a@a.com
b@b.com 3
首先,您的第一个查询在几乎所有数据库中都会 return 出错,因为您将在子查询中有两个同名的列。但是我明白了。
如果我理解正确,这应该可以满足您的要求:
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;
这与您的查询非常接近,所以我不确定它是否能解决任何问题。
我有两个 table 我可以这样加入:
select * from
(select * from table1 t1
left join table2 t2 on t1.id = t2.id )
我想在我按电子邮件分组的地方添加第三个 table,以回填上面连接中的数据,但我只想回填电子邮件计数仅为 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。
即
table 仅来自 LEFT JOIN:
email missing_id
a@a.com
b@b.com
table仅 3 个数据
email missing_id
a@a.com 1
a@a.com 2
b@b.com 3
所有 tables 加入其中电子邮件只出现一次,应该像这样在左侧加入中回填数据:
email missing_id
a@a.com
b@b.com 3
首先,您的第一个查询在几乎所有数据库中都会 return 出错,因为您将在子查询中有两个同名的列。但是我明白了。
如果我理解正确,这应该可以满足您的要求:
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;
这与您的查询非常接近,所以我不确定它是否能解决任何问题。