首页 新闻 会员 周边 捐助

sqlserver in查询的替代者

0
悬赏园豆:15 [已解决问题] 解决于 2019-09-04 19:48

var id="1,2,3,4,5,............................";
select * from A where ID in (id)
因为这个id是某一张表中记录的字段,少的有时候只有一个,多的可能有上千个。
只能根据这个ID来查询需要的内容,有没有高效的查询方式,麻烦给指点下,谢谢!

mcluzhi的主页 mcluzhi | 初学一级 | 园豆:6
提问于:2019-08-20 18:03
< >
分享
最佳答案
0

先把1,2,3,4,5,............................插入一个表(可临时表)中,然后用select * from A where exists

收获园豆:15
保镖 | 小虾三级 |园豆:759 | 2019-08-21 09:53

先把数据插入到临时表的话,还是会用到in吧
不然数据从哪里取出来插入临时表呢。

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 09:55

@mcluzhi: 创建表t_id_list id varchar(32),把你的"1,2,3,4,5,............................"这些内容分成多个条记录插入t_id_list中。一个值一条记录。
然后select * from A where exists(select id from t_id_list where id=A.ID)

保镖 | 园豆:759 (小虾三级) | 2019-08-21 09:58

@mcluzhi: "1,2,3,4,5,............................",这个数据从哪取的。

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:01

@保镖: 如果按照这种方式的话,我可以建立一个集合,然后在一条一条查询的时候都放在这个集合里,这样就不用建立临时表,也不用再去查询临时表了,您说对吧。

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:01

@保镖: 数据是死的,不是我这边查询出来的解决,类似一个参数

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:02

@mcluzhi: "1,2,3,4,5,............................"是动态的吗

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:03

@保镖: 你可以理解成传参,纯数字类型,动态的

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:04

@mcluzhi: 不能一条条查,你的需求是不是查询所有id在 "1,2,3,4,5,............................"的记录。

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:04

@保镖: 对,我只需要根据id这个传参获取对应的结果集就可以了。

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:05

@mcluzhi: 1、接收参数id="1,2,3,4,5,............................".
2、变成集合ids; list<string> ids=new List<string>{1,2,3,4,5}
3、把ids插入t_id_list id,一个值插入一条
4、执行sqlselect * from A where exists(select id from t_id_list where id=A.ID

我的原理就是把1,2,3,4,5,...........................以表的形式弄的数据库里,然后你就可以用exists进行关联查询了

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:06

@保镖: 有道理,我先测试下性能,谢谢

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:08

@mcluzhi: 参数如果几千的话,in的效率肯定低,并且可能超过sql文限制。
id参数表最好使用批量查询数据的方法,插入t_id_list中,要不然形成t_id_list表会慢。
用完再删除。

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:09

@保镖: 您说的对,所以我需要找到解决方法。

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:10

@mcluzhi: 啥数据库

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:11

@保镖: sqlserver

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 10:12

@mcluzhi: 使用SqlBulkCopy批量插入吧
如果有并发访问,需要考虑并发问题,可以建过滤字段,或使用临时表(连接内有效)。

保镖 | 园豆:759 (小虾三级) | 2019-08-21 10:13

@保镖: 经过测试,数据不达到上万,不如in的执行效率
SqlConnection sqlconn = new SqlConnection(****);
string TSqlStatement = "SELECT " + coloum + " from " + table + " as b where exists (SELECT nc.ID FROM @List AS nc where nc.ID=b.ID)";
SqlCommand cmd = new SqlCommand(TSqlStatement, sqlconn);
SqlParameter catParam = cmd.Parameters.AddWithValue("@List", dt);
catParam.SqlDbType = SqlDbType.Structured;
catParam.TypeName = "dbo.IDModel";
sqlconn.Open();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds, "ds");
cmd.Parameters.Clear();
return ds;
}

mcluzhi | 园豆:6 (初学一级) | 2019-08-21 12:47

@mcluzhi: 那我想不到其他方法了。

保镖 | 园豆:759 (小虾三级) | 2019-08-21 13:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册