首页 新闻 会员 周边

SQL语句连接查询问题

0
[已解决问题] 解决于 2021-12-10 16:49

select * from A join B on A.id in (B.sid);
怎么实现连接查询的时候,像where一样用in来做连接两张表的条件

xx_1234的主页 xx_1234 | 菜鸟二级 | 园豆:243
提问于:2021-12-09 10:42
< >
分享
最佳答案
2

如果我没理解错你的问题的话,你这个直接用等于就可以了
select * from A join B on A.id=B.sid

如果你只是想查询A表的数据,那么你可以这样
select * from A where Id in (select sid from B)

select * from A where exists (select 1 from B where B.sid=A.Id)

奖励园豆:5
izan | 菜鸟二级 |园豆:205 | 2021-12-09 15:49

A表的id是自增的主键,B表的sid是普通字段,并且还包括多个A表的id(通过逗号隔开的),我是想要A表中的id在B表中的sid中存在就查询出来

xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-10 16:14

select * from A where exists (select 1 from B where B.sid like '%,'+CAST(A.Id as nvarchar)+',%' or B.sid like CAST(A.Id as nvarchar)+',%' or B.sid like '%,' +CAST(A.Id as nvarchar))

或者,你先想办法将B的sid按逗号分隔并转换为行数据存放到临时表,然后再做这样的查询
select * from A join B on A.id=B.sid

但是不管怎么样,这种设计都是不合理的,要从设计上避免这种将逗号拼接Id存储的问题

izan | 园豆:205 (菜鸟二级) | 2021-12-10 16:25

@izan: 我最开始想的也是用你说的第二种方法,先将它转换成集合或者数组的形式,遍历再用select * from A join B on A.id=B.sid查询,感觉这样子会增加查询数据库的负担,所以就想问一下有没有直接用in来做连接两张表的条件

xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-10 16:40

@xx_1234: 你这种设计,不管怎么样做都会增加负担,反而先切割好放到临时表可能还会更快

izan | 园豆:205 (菜鸟二级) | 2021-12-10 16:42

@izan: 意思是设计一张中间表吗?但是是线上的项目,数据库不敢做太大的改动

xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-10 16:48

@izan: 感谢大佬

xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-10 16:49
其他回答(3)
0

你忘了指定连接的类型吧。join前面要加上连接类型的连接类型包括inner join、left join、right join、full out join

Halloworlds | 园豆:190 (初学一级) | 2021-12-09 13:46

都试了的,不行

支持(0) 反对(0) xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-09 14:04
0

试试:select * from a,b where a.id=b.sid and 其他条件

其他条件这里可以用你所说的In

龙行天涯 | 园豆:1794 (小虾三级) | 2021-12-09 16:29

试过了,不得行

支持(0) 反对(0) xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-10 16:15
0

这个是您理解的问题,连接是乘法操作,你这里a.sid in (b.sid) 其实就是a.sid=b.sid了,但是您的真实意思有可能不是这个。
是否是想查询 a的id在b中有的记录?
那么就直接 select * from a where a.id in(select id from b) x 这样就可以了。这个主要看您是什么意思

gw2010 | 园豆:1487 (小虾三级) | 2021-12-09 17:14

我是想要A表中的id在B表中的sid字段中存在就查询出来,A表的id是自增的主键,B表的sid是普通字段,并且还包括多个通过逗号隔开的A表的id

支持(0) 反对(0) xx_1234 | 园豆:243 (菜鸟二级) | 2021-12-10 16:16

@xx_1234: in就可以了。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2021-12-13 17:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册