当前位置:编程学习 > C#/ASP.NET >>

经常看到这个面试题

查找出表 TB第31-40条数据,主键id为int型自增长(sqlserver数据库)

俺就写的   Select  top 10 from  TB
           where id not in (Select top 30 id from TB)

总感觉掉进陷阱里去了!是不是还有其他的写法,他考这题的目的是什么? --------------------编程问答-------------------- 我也这么写 --------------------编程问答-------------------- 31-40的数据,楼主您top 10能查出什么东西啊 ,能通过么? --------------------编程问答-------------------- 没有问题,只是 top 10后面加个列名或者*就好了 --------------------编程问答--------------------
select * from tb where id>30 and id<=40
这个不对吗?
--------------------编程问答-------------------- - -
select * from TB where id beween 30 and 39

如何? --------------------编程问答-------------------- 也许别人想要ROW_NUMBER()  OVER  或者linq --------------------编程问答-------------------- 感觉用not in效率应该比下面这个会差点

select top 10 * from (select top 40 * from tb order by id) order by id desc --------------------编程问答-------------------- select * from TB where id >= min(id)+31 and id <= min(id)+40 --------------------编程问答--------------------
引用 6 楼 xcx573 的回复:
也许别人想要ROW_NUMBER() OVER 或者linq


对头,问题就在于第31-40条数据的Id不一定是31-40 --------------------编程问答-------------------- 各位,他这里说的id是自增类型,如果当中的记录被删除过,这里的id会不连续
所以select * from TB where id beween 30 and 39是错的
引用 5 楼 g4_magicvr 的回复:
- -
select * from TB where id beween 30 and 39

如何?
--------------------编程问答--------------------
引用 9 楼 sgchen2000 的回复:
引用 6 楼 xcx573 的回复:
也许别人想要ROW_NUMBER() OVER 或者linq


对头,问题就在于第31-40条数据的Id不一定是31-40

哎呀,掉进去了!  --------------------编程问答--------------------

Panel pnl = new Panel();
            LinkButton lbtn = new LinkButton();
            lbtn.Text = ds.Tables[0].Rows[i][1].ToString();
            lbtn.ID = ds.Tables[0].Rows[i][0].ToString();
            lbtn.CommandArgument = ds.Tables[0].Rows[i][0].ToString();
            lbtn.CommandName = "编辑";
            pnl.Controls.Add(lbtn);


再将pnl 添加到页面控件上 --------------------编程问答--------------------
引用 12 楼 wknight_it 的回复:
C# code


Panel pnl = new Panel();
            LinkButton lbtn = new LinkButton();
            lbtn.Text = ds.Tables[0].Rows[i][1].ToString();
            lbtn.ID = ds.Tables[0].Rows[i][0].ToStr……

发错了,晕。。。 --------------------编程问答-------------------- 应该考你2005的ROW_NUMBER函数把 --------------------编程问答-------------------- - -其实说真的linq党表示毫无压力


var sb=(from c in TB
        select c).skip(30).take(10);
--------------------编程问答-------------------- 我觉得是用的row_number() over 
去回答问题好点,我觉得主考官是从是考你对数据库的掌握程度来考的 --------------------编程问答-------------------- Select top 10 * from TB where id not in (Select top 30 id from TB order by id) order by id
--------------------编程问答--------------------


 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
   WHERE ROWNUMBER BETWEEN 31 and 40
--------------------编程问答-------------------- select * from TB where id >= min(id)+31 and id <= min(id)+40 --------------------编程问答-------------------- 这不就是数据分页查询么。

pagesize = 10
pageindex = 3 --------------------编程问答--------------------
引用 18 楼 cqfd123456 的回复:
SQL code



 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
       WHERE ROWNUMBER BETWEEN 31 and 40


谁解释那什么意思!!  特别是OVER --------------------编程问答-------------------- 什么数据库呀?
--------------------编程问答--------------------
引用 22 楼 bbb332 的回复:
什么数据库呀?
是2000还是2005? --------------------编程问答-------------------- oracle数据库的话:
slect * from (select * ,rownum from tablename where rownum<4*10)
where rownum>(4-1)*10 --------------------编程问答-------------------- select * from TB where id >= min(id)+31 and id <= min(id)+40 
--------------------编程问答--------------------
引用 23 楼 bbb332 的回复:
引用 22 楼 bbb332 的回复:

什么数据库呀?
是2000还是2005?

还是2008? --------------------编程问答-------------------- 这个题目还是不错的 --------------------编程问答--------------------  SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
       WHERE ROWNUMBER BETWEEN 31 and 40
--------------------编程问答--------------------

SELECT     TOP (10)  *
FROM         (SELECT     TOP (40) *
                       FROM          tab_orders
                       ORDER BY ID DESC) AS derivedtbl_1

--------------------编程问答-------------------- 我还是觉得top  in  好点,BETWEEN 的话,要是中间有数据删除了呢 --------------------编程问答--------------------  ROW_NUMBER()也不错 --------------------编程问答--------------------
引用 18 楼 cqfd123456 的回复:
SQL code


 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
       WHERE ROWNUMBER BETWEEN 31 and 40

SqlServer2005以后用这个,千万别用not in 效率很差 --------------------编程问答-------------------- 宁愿用left join后判断条件是否为null --------------------编程问答--------------------
SELECT TOP 10 * FROM (
SELECT TOP 40 * FROM TB ORDER BY ID DESC)
ORDER BY ID ASC

要注意排序。 --------------------编程问答--------------------
引用 34 楼 laowang134 的回复:
SQL code

SELECT TOP 10 * FROM (
SELECT TOP 40 * FROM TB ORDER BY ID DESC)
ORDER BY ID ASC

要注意排序。

SELECT TOP 10 * FROM (
SELECT TOP 40 * FROM TB ORDER BY ID DESC) T
ORDER BY ID ASC
--------------------编程问答-------------------- 考官主要是想考你ROW_NUMBER. --------------------编程问答-------------------- SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
  WHERE ROWNUMBER BETWEEN 31 and 40
--------------------编程问答-------------------- 忘记排序了,不排序有可能顺序不一样 --------------------编程问答-------------------- select * from TB where id >= min(id)+31 and id <= min(id)+40  这个很好啊 --------------------编程问答-------------------- ....top 10....in top 40... desc --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主的写法没有错。
Select top 10 from TB
where id not in (Select top 30 id from TB)


这是row_number  的写法
select * from
(
 Select *,row_Number() over(oder by id asc) as row from TB
) as tab1
where 30<=tab1.row and tab1.row <40
;

--------------------编程问答-------------------- 补 :
楼主最好还是
加上 order by id asc --- 才是不倒序

Select top 10 * from TB 
where id not in (Select top 30 id from TB)
order by id asc
--------------------编程问答--------------------
引用 15 楼 g4_magicvr 的回复:
- -其实说真的linq党表示毫无压力


C# code


var sb=(from c in TB
        select c).skip(30).take(10);

Linq党在这方面是强项,汗啊,偶一直没学Linq --------------------编程问答--------------------
引用 5 楼 g4_magicvr 的回复:
- -
select * from TB where id beween 30 and 39

如何?


肯定不对三~~ --------------------编程问答-------------------- select * from (select Row_number() over(order by id) RowNums,* from TB) as temp where temp.RowNums between 30 and 39 --------------------编程问答-------------------- MySql:select * from TB limit 30,40 order by id ASC;
--------------------编程问答-------------------- 主要应该考察的是 SQL 中的 子查询 和开窗函数的 Row_number()用法 --------------------编程问答-------------------- 为什么那么多人不看完回复就忙着发帖了,
看到很多人还在犯前面帖子已经纠正过的错误。 --------------------编程问答-------------------- 我出的面试题里就有这题,其实我只要求写出来ROW_NUMBER,我就认为对了 --------------------编程问答-------------------- 但是用top的方式我也不会说不对,招人不会只看某一题的对错 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 7 楼 beyond_me21 的回复:
感觉用not in效率应该比下面这个会差点

select top 10 * from (select top 40 * from tb order by id) order by id desc

这个写法比较支持或者用ROW_NUMBER,2者都可,唯独select * from tb where id>30 and id<=40不对! --------------------编程问答-------------------- Select top 10 * From (Select top 40 * From D划价数据 order by ID) A Order by ID desc

肯定用这个哈.一次扫描就可以解决. --------------------编程问答--------------------
引用 39 楼 jarry42 的回复:
select * from TB where id >= min(id)+31 and id <= min(id)+40  这个很好啊


万一中间跳过了20 25呢?? --------------------编程问答-------------------- select top 10 * from (select top 40 * from tb order by id) order by id desc --------------------编程问答-------------------- 以前用row_number() 现在公司用2000的 --------------------编程问答-------------------- select top 40 * from tb where id in(select top 10 from tb where id not in(select top 30 from tb))
这样应该能也能查询出来,我还是学生,错了还请见谅,没在数据里去式差,直接在这里给你写的 --------------------编程问答-------------------- select * from TB limit 10 30 --------------------编程问答-------------------- select * from TB limit 30 10 --------------------编程问答-------------------- 不错,我也遇到好几次啦
我都是这么写的


select top 10 * from TB where id not in (select top 30 id from TB)
--------------------编程问答-------------------- 重新生成一个临时表,产生新的序列后再查找 --------------------编程问答-------------------- select * from TB where id beween 31 and 40 
OR
select * from tb where id>30 and id<41
之类的只适合tb的ID中间没有断档的情况,31,32,33,。。。40这样,这只能是理想情况

还是这样写比较通用些,
Select top 10 * from TB
  where id not in (Select top 30 id from TB order by id) ORDER BY id
--------------------编程问答-------------------- 九楼正解~~~ --------------------编程问答-------------------- Select top 10 id from TB
  where id in (Select top 40 id from TB order by id desc)
这样也可以
--------------------编程问答-------------------- 我觉得面试的话,还是用row_number() 这个比较好,给自己加分啊! --------------------编程问答-------------------- 原题是:查找出表 TB第31-40条数据,主键id不是连续的;楼主方法可以 --------------------编程问答--------------------
引用 11 楼 a78782295 的回复:
引用 9 楼 sgchen2000 的回复:
引用 6 楼 xcx573 的回复:
也许别人想要ROW_NUMBER() OVER 或者linq


对头,问题就在于第31-40条数据的Id不一定是31-40

哎呀,掉进去了!


我也掉了 --------------------编程问答--------------------
引用 4 楼 a78782295 的回复:
select * from tb where id>30 and id<=40
这个不对吗?

肯定不对啊,呵呵~哪有这样写的啊! --------------------编程问答--------------------
引用 69 楼 sharpshoote123 的回复:
引用 4 楼 a78782295 的回复:
select * from tb where id>30 and id<=40
这个不对吗?

肯定不对啊,呵呵~哪有这样写的啊!
你怎么知道id是从1开始增长的啊?一般都是无序的...... --------------------编程问答-------------------- --------------------编程问答-------------------- 网上不是有这一种吗?
select top 10 * from table where Id<(select MIN(Id) from ( select top 20 Id from table order by Id desc) ) order by Id desc --------------------编程问答-------------------- SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
  WHERE ROWNUMBER BETWEEN 31 and 40
--------------------编程问答--------------------
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
  WHERE ROWNUMBER BETWEEN 31 and 40
--------------------编程问答--------------------
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
  WHERE ROWNUMBER BETWEEN 31 and 40
--------------------编程问答-------------------- SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
  WHERE ROWNUMBER BETWEEN 31 and 40

这个谁能解释一下? --------------------编程问答-------------------- select top10 * from  (select top 40 * from tb order by id asc ) a order by a.id desc --------------------编程问答-------------------- 4、5樓的寫法肯定錯,邏輯有問題。
lz的寫法是可以的,其他人也不用刻意去寫的更負責,嵌套子查詢越多,效率越低下。 --------------------编程问答--------------------
引用楼主 mf19870602 的回复:
查找出表 TB第31-40条数据,主键id为int型自增长(sqlserver数据库)

俺就写的   Select  top 10 from  TB
           where id not in (Select top 30 id from TB)

总感觉掉进陷阱里去了!是不是还有其他的写法,他考这题的目的是什么?

你这样写的话查询出来的数据不准确  Select  top 10 from  TB
           where id not in (Select top 30 id from TB order by id)order by id 必须加上order by 不然的话 每次查询出来的数据会不同 --------------------编程问答-------------------- 先根据ID排序,再取最后的十条记录 --------------------编程问答--------------------
引用 21 楼 chongerwing 的回复:
引用 18 楼 cqfd123456 的回复:
SQL code



SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER,* FROM TB) A
WHERE ROWNUMBER BETWEEN 31 and 40


谁解释那什么意思!!  特别是OVER

就是一个语法,不必纠结。 over后面 的是排序的字段名称。 ROW_NUMBER() 表示数据库中从1开始的连续的一列数字 --------------------编程问答-------------------- 在不确定TB表是否删除过数据的情况下,以下sql语句通用。
select * from (
select *,ROW_NUMBER() over(order by id) as rowid from TB  
) t
where rowid between 31 and 40 --------------------编程问答--------------------
引用 30 楼 aspnetchengxu 的回复:
我还是觉得top  in  好点,BETWEEN 的话,要是中间有数据删除了呢

between 30  and 40是肯定不对的,面试的时候一定不要这样写。 --------------------编程问答-------------------- 我也经常遇到你的题没有写完整吧应该还有一个条件是有的中间会缺少几条数。我跟你写的一样o.o

--------------------编程问答--------------------
引用 7 楼 beyond_me21 的回复:
感觉用not in效率应该比下面这个会差点

select top 10 * from (select top 40 * from tb order by id) order by id desc

比较赞同这种写法 --------------------编程问答-------------------- 很有代表性的一个题目。 --------------------编程问答-------------------- 方法1.
WITH cte AS
(
    SELECT ID, ROW_NUMBER() OVER(ORDER BY IDASC) AS ROWNUMBER FROM TABLE
)
SELECT * FROM cte WHERE ROWNUMBER > 30 AND ROWNUMBER < 40;

方法2.
SELECT TOP 10 a.* FROM TABLE AS a
WHERE a.ID NOT EXISTS
(
    SELECT TOP 20 * FROM TABLE WHERE ID = a.ID
);

方法3.
WITH cte AS
(
    SELECT TOP 30 FROM TABLE ORDER BY ID DESC
)
SELECT TOP 10 * FROM cte;

。。。。。 --------------------编程问答-------------------- 之前就有总结过了呀,他总结了四种,一种是not in,一种是max,一种rownumber,一种是rownumber演化的,不需要知道列名的 --------------------编程问答-------------------- 这是用来做分页用的,分页用SQL比较快,答案网上多的是,就不写了。。。
自己查,基本的学习能力 --------------------编程问答-------------------- 这个题目其实就是想考你对分页sql语句的了解
降序:
select top 10 id from TB where id<(select min(id) from (select top 30 id from TB order 
 by id desc )) order by id desc 
升序:
select top 10 id from TB where id>(select max(id) from (select top 30 id from TB order by id asc )) order by id asc

换成分页sql语句就是:
int pagesize;
int pageindex;
select top pagesize id from TB where id<(select min(id) from (select top pagesize*(pageindex-1) id from TB order by id desc)) order by id asc 

--------------------编程问答--------------------

with tb AS
(
select row_number() over(order by id asc) as rowID from tbName
)
select * from aa where rowid between 31 and 40
--------------------编程问答-------------------- 晕,上面那个发错了


with tb AS
(
select row_number() over(order by id asc) as rowID from tbName
)
select * from tb where rowID between 31 and 40

--------------------编程问答-------------------- 。。。。。。。。。。。。。。。。。。懒得去说这个问题 --------------------编程问答-------------------- 等下别人主键ID不是在30跟40之内你肿么查的出来
引用 69 楼 sharpshoote123 的回复:
引用 4 楼 a78782295 的回复:
select * from tb where id>30 and id<=40
这个不对吗?

肯定不对啊,呵呵~哪有这样写的啊!
--------------------编程问答-------------------- select * from TB t where (select count(*) from TB t1 where t1.ID < t.ID) >= 31
                     and (select count(*) from TB t1 where t1.ID < t.ID) <= 40  --------------------编程问答--------------------
引用 95 楼 lm2302293 的回复:
select * from TB t where (select count(*) from TB t1 where t1.ID < t.ID) >= 31
                     and (select count(*) from TB t1 where t1.ID < t.ID) <= 40


刚才那个错了,假设数据行的号码是从1开始的,那么:
select * from TB t where (select count(*) from TB t1 where t1.ID < t.ID) >= (31-1)
                     and (select count(*) from TB t1 where t1.ID < t.ID) < 40  --------------------编程问答--------------------
引用 3 楼 ssp2009 的回复:
没有问题,只是 top 10后面加个列名或者*就好了
有病,我说的就是这个问题,你还说没问题 --------------------编程问答--------------------
引用楼主 mf19870602 的回复:
查找出表 TB第31-40条数据,主键id为int型自增长(sqlserver数据库)

俺就写的   Select  top 10 from  TB
           where id not in (Select top 30 id from TB)

总感觉掉进陷阱里去了!是不是还有其他的写法,他考这题的目的是什么?








select * from Table_1 WHERE ID>= (SELECT min(ID) FROM Table_1)+30 AND ID<=(SELECT min(ID) FROM Table_1)+39


--------------------编程问答-------------------- qq 群  10649 7038 --------------------编程问答-------------------- 考此题的目的。。是看你能不能知道  自增ID 不连续  可能中间有删除掉的
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,