有关SQL 中Left Join 的有关问题,求大神帮助
有关SQL 中Left Join 的问题,求大神帮助
我想用一个表中的两个字段去关联另一个表中的一个字段
差不多就是
select * from ta a left join tb b on (a.a1=b.b1 or a.a2=b.b2)
逻辑上就是
if a1=b1
then 关联
else
if a2=b1
then 关联
请问这么写会不会造成数据重复
或者有其它写法
------解决思路----------------------
会不会造成数据的重复需要看楼主的具体数据了,简单点可以加 distinct 去掉重复数据,但效率会有点小影响!
一句话,没有真实的实例,无法按楼主的想法去分析。
------解决思路----------------------
看一下具体的数据
用distinct 或者 group by
都可以
------解决思路----------------------
如果你的逻辑是这样,那这样写就可以了,去除重复,建议用GROUP BY 虽然麻烦点~
------解决思路----------------------
这样写可能会造成重复的。如果表A 的A1,A2在表B的B1中都存在。就会关联2次。
举个例子
你可以针对这种情况。设置优先级。如果A表中2列都能关联哪个先关联,
然后对最后结果分组。
------解决思路----------------------
或者用这个试试
我想用一个表中的两个字段去关联另一个表中的一个字段
差不多就是
select * from ta a left join tb b on (a.a1=b.b1 or a.a2=b.b2)
逻辑上就是
if a1=b1
then 关联
else
if a2=b1
then 关联
请问这么写会不会造成数据重复
或者有其它写法
------解决思路----------------------
会不会造成数据的重复需要看楼主的具体数据了,简单点可以加 distinct 去掉重复数据,但效率会有点小影响!
一句话,没有真实的实例,无法按楼主的想法去分析。
------解决思路----------------------
看一下具体的数据
用distinct 或者 group by
都可以
------解决思路----------------------
如果你的逻辑是这样,那这样写就可以了,去除重复,建议用GROUP BY 虽然麻烦点~
------解决思路----------------------
这样写可能会造成重复的。如果表A 的A1,A2在表B的B1中都存在。就会关联2次。
举个例子
with cte as
(select 1 as id,2 as id1 union all
select 2 as id,9 as id1 union all
select 0 as id,3 as id1 union all
select 4 as id,10 as id1 union all
select 10 as id,20 as id1 ),
cte1 as
(select 1 as id,'a' as name union all
select 2 as id,'b' as name union all
select 3 as id,'c' as name union all
select 4 as id,'d' as name union all
select 5 as id,'e' as name union all
select 6 as id,'f' as name )
select * from cte as a join cte1 as b
on a.id=b.id or a.id1=b.id
--结果
id id1 id name
----------- ----------- ----------- ----
1 2 1 a
1 2 2 b
2 9 2 b
0 3 3 c
4 10 4 d
(5 行受影响)
你可以针对这种情况。设置优先级。如果A表中2列都能关联哪个先关联,
然后对最后结果分组。
------解决思路----------------------
或者用这个试试
with cte as
(select 1 as id,2 as id1 union all
select 2 as id,9 as id1 union all
select 0 as id,3 as id1 union all
select 4 as id,10 as id1 union all
select 10 as id,20 as id1 ),
cte1 as
(select 1 as id,'a' as name union all
select 2 as id,'b' as name union all
select 3 as id,'c' as name union all
select 4 as id,'d' as name union all
select 5 as id,'e' as name union all
select 6 as id,'f' as name )
select * from cte as a join cte1 as b
on a.id=b.id
union all
select * from cte as a join cte1 as b
on a.id1=b.id where a.id not in(select id from cte1)
--结果
id id1 id name
----------- ----------- ----------- ----
1 2 1 a
2 9 2 b
4 10 4 d
0 3 3 c
(4 行受影响)