Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]请问纵云娣老师的查找符合条件的第一个记录中条件代码的含义

殷小宝  发表于:2012-04-18 23:13:47  
复制

查询代码是这样的:

SELECT NewQ1.ID, NewQ1.人名, NewQ1.数值1, NewQ1.数值2

FROM T1 AS NewQ1

WHERE ((((Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))=123) AND (((Select Top 1 T1.数值2 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))=234));

后面的((((Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))=123) AND (((Select Top 1 T1.数值2 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))=234));怎么解读?尤其是T1.ID<NewQ1.ID 是何意思?为什么Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))等于123呢?

点击下载此附件

 

Top
纵云梯 发表于:2012-04-19 00:10:48

原来查询语句:

SELECT NewQ1.ID, NewQ1.人名, NewQ1.数值1, NewQ1.数值2 FROM T1 AS NewQ1 WHERE ((((Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))=123) AND (((Select Top 1 T1.数值2 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC))=234));

 

第一次简化后的查询语句(去掉多余的括号,只剩下必要的。):

SELECT NewQ1.ID, NewQ1.人名, NewQ1.数值1, NewQ1.数值2 FROM T1 AS NewQ1 WHERE (Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)=123 AND (Select Top 1 T1.数值2 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)=234;

 

第二次简化后的查询语句(分析时不用那么多条件,一个就够了,反正多是一样,条件多一点而已。):

SELECT NewQ1.ID, NewQ1.人名, NewQ1.数值1, NewQ1.数值2 FROM T1 AS NewQ1 WHERE (Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)=123;

 

开始分析二次简化后的询语句:

    1)“SELECT NewQ1.ID, NewQ1.人名, NewQ1.数值1, NewQ1.数值2 FROM T1 AS NewQ1”这部分的意思是“SELECT ID, 人名, 数值1, 数值2 FROM T1”但从新为这个查询从新定义一个名叫“NewQ1”的查询,之所以这样做是因为在后面的Where里要跟【T1】表本身自己和自己比较,所以要从新命名以便对比时不会出现引用混乱。

   

    2)首先“WHERE (Select...)”有点类似“WHERE In(...)”和“WHERE Exists(Select...)”的用法类似;然后具体看“(Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)”,它的意思是:选择在【T1】表里【数值1】字段中第一个记录,所谓的第一个记录还要看查询语句中记录的排列顺序(这里是Order by T1.ID DESC,不作具体解析了。)和条件(这里是Where T1.ID<NewQ1.ID)来最后决定。“Where T1.ID<NewQ1.ID”的意思是【T1】表里【ID】字段中的记录只能小于【NewQ1】查询里【ID】字段的记录。最后的“=123”意为【T1】表里【数值1】字段中第一个记录经过一轮排序和条件筛选后还得符合“=123”这个条件。



纵云梯 发表于:2012-04-19 00:21:14

“WHERE (Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)”这个条件意在找出每个NewQ1查询里的记录的下一个记录。

 

其实我所用的全部是SQL中子查询的知识,子查询可以说是SQL的高级应用,应该多学习和钻研。我在这方面只懂一点皮毛是个初学者。精通子查询后对数据的处理简直就是博大精深,予取予求啊。如果想学习更多子查询的知识就到网上查查“SQL 子查询”或“SQL Subquery”关键词吧,Good luck!



殷小宝 发表于:2012-04-20 10:52:36

思索良久,尚未彻悟,比ID号2小的记录不是没有了吗?怎么能符合这个条件呢?ID号2中的数值1=123,其第一条记录不是没有吗?怎么等于123呢?



纵云梯 发表于:2012-04-20 15:14:39

点击下载此附件

 

如图所示:

    【...上一个记录】项找出【NewQ1】查询里每一个记录的上一个记录,【ID】=2的记录当然没有“上一个记录”因为它已经是第一个,那么查出【数字1】项=123,符合这个条件的记录就是“查询符合条件记录的下一个记录”了。符合【数字1】=123的记录有两个,一个是【ID】=2而它的下一个记录是【ID】=4(即人名=“李四”的那个记录),另一个是【ID】=7而它的下一个记录是【ID】=4(即人名=“汪”的那个记录)。再看看人名=“李四”和人名=“汪”的记录的【...上一个记录】项里是不是都是123呢。

 

还有我之前粗心大意把

“WHERE (Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)”这个条件意在找出每个NewQ1查询里的记录的一个记录。

解释错了。

应该是

“WHERE (Select Top 1 T1.数值1 From T1 Where T1.ID<NewQ1.ID Order by T1.ID DESC)”这个条件意在找出每个NewQ1查询里的记录的一个记录。



殷小宝 发表于:2012-04-20 20:25:09

谢谢纵云娣老师详细的讲解,我也从中悟出了一个道理:

DESC顺序:从上往下查询,位于条件的上一条记录;ASC:从符合条件的下行开始查询,位于条件的下一条记录.

子查询只能选择一条记录(Select Top 1 T1.数值1)

 



殷小宝 发表于:2012-04-20 20:54:25

T1.ID<NewQ1.ID Order by T1.ID DESC这段代码可以作为通用代码.



殷小宝 发表于:2012-04-20 21:02:14
T1.ID<NewQ1.ID  ID比自身ID小,所以用DESC.

殷小宝 发表于:2012-04-20 21:06:28

老师也没错,下一记录经过重新排序不就变为上一记录了吗?

 



总记录:8篇  页次:1/1 9 1 :