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), ......)

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


...全文
877 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧