先把1,2,3,4,5,............................插入一个表(可临时表)中,然后用select * from A where exists
先把数据插入到临时表的话,还是会用到in吧
不然数据从哪里取出来插入临时表呢。
@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)
@mcluzhi: "1,2,3,4,5,............................",这个数据从哪取的。
@保镖: 如果按照这种方式的话,我可以建立一个集合,然后在一条一条查询的时候都放在这个集合里,这样就不用建立临时表,也不用再去查询临时表了,您说对吧。
@保镖: 数据是死的,不是我这边查询出来的解决,类似一个参数
@mcluzhi: "1,2,3,4,5,............................"是动态的吗
@保镖: 你可以理解成传参,纯数字类型,动态的
@mcluzhi: 不能一条条查,你的需求是不是查询所有id在 "1,2,3,4,5,............................"的记录。
@保镖: 对,我只需要根据id这个传参获取对应的结果集就可以了。
@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进行关联查询了
@保镖: 有道理,我先测试下性能,谢谢
@mcluzhi: 参数如果几千的话,in的效率肯定低,并且可能超过sql文限制。
id参数表最好使用批量查询数据的方法,插入t_id_list中,要不然形成t_id_list表会慢。
用完再删除。
@保镖: 您说的对,所以我需要找到解决方法。
@mcluzhi: 啥数据库
@保镖: sqlserver
@mcluzhi: 使用SqlBulkCopy批量插入吧
如果有并发访问,需要考虑并发问题,可以建过滤字段,或使用临时表(连接内有效)。
@保镖: 经过测试,数据不达到上万,不如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: 那我想不到其他方法了。