BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #4700同步于 2010/8/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

一个数据库select查找问题

niumeng121
2010/8/2镜像同步11 回复
用ACCESS查找数据库,遇到个小难题,求SQL语句! Id 货号 经手人 1 300 甲 2 300 乙 3 300 丙 4 500 甲 5 500 甲 6 600 丙 7 600 丙 同一个货号可能有多个经手人,现在想找出只经过一个经手人的货号, 那么输出应该是》 货号 500 600 实在是想不出来方法了,特来求助。 问题也可以简化为求只经过一个经手人 甲 的货号 那么输出即是 货号 500
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
newtj机器人#1 · 2010/8/3
select 货号 from( select distinct 货号,经手人 from table) t1 group by t1.货号 having count(*)=1
niumeng121机器人#2 · 2010/8/3
太厉害了! 但是假如选只经过某一个特定经手人呢? 我试了在下面加上where t1,经手人=甲, 但是不对,他会把带有甲的都选出来。 另外就是,不能同时选出货号和经手人,我这么弄的,但是不对。。。那么怎么能选出来呢。。。 select 货号,经手人 from( select distinct 货号,经手人 from table) t1 group by t1.货号,t1.经手人 having count(*)=1
newtj机器人#3 · 2010/8/4
太厉害了! 但是假如选只经过某一个特定经手人呢? 我试了在下面加上where t1,经手人=甲, 但是不对,他会把带有甲的都选出来。 另外就是,不能同时选出货号和经手人,我这么弄的,但是不对。。。那么怎么能选出来呢。。。 -------------------------------------------------------------------------------------------------------- 第一个问题: select 货号 from( select distinct 货号,经手人 from table) t1 where t1.经手人='甲' group by t1.货号 having count(*)=1 第二个问题: select 货号,经手人 from table where 货号 in (select 货号 from( select distinct 货号,经手人 from table) t1 group by t1.货号 having count(*)=1 ) 【 在 niumeng121 的大作中提到: 】 : 太厉害了! : 但是假如选只经过某一个特定经手人呢? : 我试了在下面加上where t1,经手人=甲, : ...................
niumeng121机器人#4 · 2010/8/4
谢谢~谢谢~~ 不过,事实上这两个都有些小问题, 第一个问题里,求只经过特定经手人甲的货号, 从结果来看,是先执行了括号里的语句,把重复的数据删掉了。但是紧接着执行的是where语句,选出了经手人为甲的货号,最后再执行having,但我觉得实际上此时的having已经没有用了,因为只能提取出一个特定的经手人为甲的货号。 例子比如,第一步结束时, 货号 经手人 700 丙 800 甲 900 甲 900 乙 按照之前的写法这样他会选出800和900的。 而假如可以先执行having,就会先把900删掉,再执行where就对了(但是直接把where放在语句最后似乎行不通) 第二个问题 在第三行where 货号这里,一切都很正确,但是从table里select 货号,经手人,就会出现重复, 例子比如, 500 甲 500 甲 600 丙 600 丙 所以最后我在这里加了一个distinct,让其去掉冗余,并且在where语句里加上了经手人: select distinct 货号,经手人 from table where 经手人=‘甲’ 货号 in (select 货号 from( select distinct 货号,经手人 from table) t1 group by t1.货号 having count(*)=1 ) 这个看起来是正确的了 但是问题又来了,假如只有几百个数据还好,可是我这里有19万条数据,执行下来要5分钟,ms语句的性能很差。 但是又不知道如何改,(把distinct换成top 1,结果只给我出第一条,太屎了。。。) 【 在 newtj 的大作中提到: 】 第一个问题 select 货号 from( select distinct 货号,经手人 from table) t1 where t1.经手人='甲' group by t1.货号 having count(*)=1 第二个问题 select 货号,经手人 from table where 货号 in (select 货号 from( select distinct 货号,经手人 from table) t1 group by t1.货号 having count(*)=1 )
bygones机器人#5 · 2010/8/4
我的方法可以解决你的两个问题:select g.* from table g where (select count(*) from table g1 where g1.货号=g.货号)= (select count(*) from table g2 where g2.货号=g.货号 and g2.经手人=g.经手人) 另外,二楼的方法很不错,就是对于楼主的第二个问题的办法不太好,三层嵌套效率好像有点低。可以考虑用标量子查询也许效率会好些。
newtj机器人#6 · 2010/8/4
更好的解决办法是比较复杂的逻辑判断在代码(java,c#等)中实现,一个sql写得太复杂不是好事,sql能简单还是简单好啊
doujiang机器人#7 · 2010/8/5
【 在 bygones 的大作中提到: 】 : 我的方法可以解决你的两个问题:select g.* from table g where (select count(*) from table g1 where g1.no=g.no)= : (select count(*) from table g2 where g2.货号=g.货号 and g2.经手人=g.经手人) : 另外,二楼的方法很不错,就是对于楼主的第二个问题的办法不太好,三层嵌套效率好像有点低。可以考虑用标量子查询也许效率会好些。 : ................... 求解释 where后的这个判断语句没搞懂
bygones机器人#8 · 2010/8/5
写错了,应该是货号,不是no.... 这个需求的意思就是找出所有货号和经手人分别都相同的行。 所以对于符合条件的行,其以货号为过滤条件的行总数必定与以货号以及经手人为过滤条件的行总数相同。 【 在 doujiang 的大作中提到: 】 : : 我的方法可以解决你的两个问题:select g.* from table g where (select count(*) from table g1 where g1.no=g.no)= : : (select count(*) from table g2 where g2.货号=g.货号 and g2.经手人=g.经手人) : : 另外,二楼的方法很不错,就是对于楼主的第二个问题的办法不太好,三层嵌套效率好像有点低。可以考虑用标量子查询也许效率会好些。 : ...................
doujiang机器人#9 · 2010/8/6
好复杂啊,嘿嘿,还有个小问题,没有去重 【 在 bygones 的大作中提到: 】 : 我的方法可以解决你的两个问题:select g.* from table g where (select count(*) from table g1 where g1.货号=g.货号)= : (select count(*) from table g2 where g2.货号=g.货号 and g2.经手人=g.经手人) : 另外,二楼的方法很不错,就是对于楼主的第二个问题的办法不太好,三层嵌套效率好像有点低。可以考虑用标量子查询也许效率会好些。 : ...................