SQL Server怎么实现多列子查询?

gada352 2015-07-14 11:05:13
有一个表T, 有键值对Col1、Col2

Col1 Col2 Col3
----------------------------------------------------
1 1 XXX
1 2 XXX
1 3 XXX
2 1 XXX
2 2 XXX
2 3 XXX
3 1 XXX
3 2 XXX
3 3 XXX
.....


我想写一个类似于下面的多列子查询的语句
select * from T where (Col1, Col2) in ((1, 2), (2, 1), (3, 3), ......)

就是想指定一些键值的集合来查询


...全文
628 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
gada352 2015-07-14
引用 6 楼 AcHerat 的回复:
[quote=引用 5 楼 gada352 的回复:] 不好意思没太看明白,Col3的值的随便,跟查询没什么关系,@是起什么作用的
2楼解释了是特殊符号,起个连接作用,相当于把col2和col3用特殊符号连接起来作为一个字段去处理,一个字段的in会写吧![/quote] 比如我要查Col1和Col2,可以写成 select * from t where cast(col1 as varchar) + '@' + cast(col2 as varchar) in ('1@2','2@1', '3@3', ....) 是这个意思吗?相当于把多列合成一个列来查询?@AcHerat 我试试
回复
引用 7 楼 gada352 的回复:
[quote=引用 4 楼 yupeigu 的回复:] 在sql server里不支持这种写法,要写,只能这么写: select * from T where (Col1=1 and Col2=2) or (Col1=2 and Col2=1) ...
就是感觉这么写语句有点长,如果集合内的键值对多的话[/quote] 能不能在程序里做处理呢,因为这样 如果键值对很长,实际查询时会比较慢。 能否把 这些键值对 放到一个单独的表里,比如这样;
declare @t table(col1 int,col2 int)

insert into @t
values(1,2),(2,1),(3,3)

--select * from @t


select * from T inner join @t tt on tt.col1 = t.col1 and tt.col2 = t.col2
回复
gada352 2015-07-14
引用 4 楼 yupeigu 的回复:
在sql server里不支持这种写法,要写,只能这么写: select * from T where (Col1=1 and Col2=2) or (Col1=2 and Col2=1) ...
就是感觉这么写语句有点长,如果集合内的键值对多的话
回复
gada352 2015-07-14
不好意思没太看明白,Col3的值的随便,跟查询没什么关系,@是起什么作用的
回复
AcHerat 2015-07-14
引用 5 楼 gada352 的回复:
不好意思没太看明白,Col3的值的随便,跟查询没什么关系,@是起什么作用的
2楼解释了是特殊符号,起个连接作用,相当于把col2和col3用特殊符号连接起来作为一个字段去处理,一个字段的in会写吧!
回复
在sql server里不支持这种写法,要写,只能这么写: select * from T where (Col1=1 and Col2=2) or (Col1=2 and Col2=1) ...
回复
AcHerat 2015-07-14
另外也不建议你这么做,能说说具体逻辑么? 难道不能用 select * from t where col2 = ? and col3 = ? 这种语法查询数据? 如果是多行数据,先把你输入的数据做一个临时表 @t ,执行查询 select * from t as a where exists (select 1 from @t as b where a.col2 = b.col2 and a.col3 = b.col3)
回复
AcHerat 2015-07-14
@是特殊符号,你可以用其他的,例如 , ; | $ % &等等
回复
AcHerat 2015-07-14
select * from t where cast(col2 as varchar) + '@' + col3 in ('1@XXX','2@XXX',....)
回复
gada352 2015-07-14
谢谢各位,又学一招
回复
江南小鱼 2015-07-14
你看下执行计划,小数量效率应该是旗鼓相当
回复
江南小鱼 2015-07-14
应该是这二种效率高 你看下执行计划,小数量效率应该是旗鼓相当
回复
gada352 2015-07-14
请问各位大神,当要查找的键值对比较多的时候,两种写法哪个效率高? 一: select * from t where cast(col1 as varchar) + '@' + cast(col2 as varchar) in ('1@2','2@1', '3@3', ....) 二: declare @t table(col1 int,col2 int) insert into @t values(1,2),(2,1),(3,3) --select * from @t select * from T inner join @t tt on tt.col1 = t.col1 and tt.col2 = t.col2
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-07-14 11:05
社区公告
暂无公告