搜索
查看: 4523|回复: 7

如何在sqlite 中用SQL 找到符合特定条件的所有记录?

[复制链接]

1

主题

15

帖子

120

积分

一级会员

Rank: 2

积分
120
发表于 2014-3-15 01:16:18 | 显示全部楼层 |阅读模式
如何在sqlite 中用SQL 找到符合特定条件的所有记录?

数据库的结构如下:
Num                V1                F2
1                4                0
2                4                0
3                6                0
4                7                0
5                7                0


Num        : 是编号
V1:是 要处理的 数据
F2:用于标记符合条件的记录;  0,不符合    1,符合

特定条件:当前记录 V1 的值   和  上一条记录 V1 的值 相等; 如  第2 , 5  条记录的 V1值和上一条相等。(4=4;7=7)

然后,修改 第2 , 5  条记录的 F2值为  1 。



回复

使用道具 举报

1

主题

15

帖子

120

积分

一级会员

Rank: 2

积分
120
 楼主| 发表于 2014-3-15 02:47:50 | 显示全部楼层

我坐了个 样本, 接下来该怎么做??? [code]import console; import sqlite; var sqlconn =sq

我坐了个 样本,  接下来该怎么做???

  1. import console;
  2. import sqlite;

  3. var sqlconn =sqlite(":memory:");  
  4. var tNm ="DData" ;

  5.         if( not sqlconn.existsTable(tNm)){
  6.                 sqlconn.exec("CREATE TABLE "+ tNm +"(
  7.                         Num INTEGER,
  8.                         V1 INTEGER,
  9.                         F2 INTEGER

  10.                         );"
  11.                 );

  12.                 // 创建一个 样本表
  13.                 var sArr={ 4;4;6;7;7;6;8}//样本 V1 数据
  14.                 var i=0,s
  15.                 for ( k,v in sArr){
  16.                         i++;
  17.                         s="insert into "+ tNm +" values (" + i + "," + v + ",0 );" ;
  18.                         //console.log(s)
  19.                         sqlconn.exec( s ) ;  
  20.                 }
  21.         }

  22. //显示 样本表 的内容
  23. var tb = sqlconn.getTable("SELECT * FROM "+ tNm ); // 遍历   所有 记录
  24. for(k,v in tb){
  25.         console.log(v.Num,v.V1,v.F2);
  26. }

  27. // 求助:  如何在sqlite 中用SQL 找到符合特定条件的所有记录?

  28. console.pause();
  29. console.close();
复制代码


回复

使用道具 举报

1

主题

15

帖子

120

积分

一级会员

Rank: 2

积分
120
 楼主| 发表于 2014-3-15 04:22:07 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=65069&ptid=11733][c

AAuFuns 发表于 2014-3-15 02:47
我坐了个 样本,  接下来该怎么做???

哈哈 ,搞定了~


  1. // 求助:  如何在sqlite 中用SQL 找到符合特定条件的所有记录?
  2. //var s= "SELECT tB.* FROM  (SELECT * FROM DData as tC,DData as tA  Where tC.Num=tA.Num+1 And tC.V1=tA.V1) as tB "
  3. var s= "UPDATE DData
  4.            Set F2=1
  5.            Where DData.Num In  
  6.                (SELECT tC.Num
  7.                FROM DData as tC,DData as tA  
  8.                Where tC.Num=tA.Num+1 And tC.V1=tA.V1) ;
  9.        "
  10. sqlconn.exec( s ) ;

  11. var tb = sqlconn.getTable("SELECT * FROM "+ tNm ); //(s); // 遍历   所有 记录
  12. for(k,v in tb){
  13.         console.log(v.Num,v.V1,v.F2);
  14. }
  15. console.log('=============================================')

复制代码
回复

使用道具 举报

33

主题

543

帖子

3304

积分

荣誉会员

Rank: 8Rank: 8

积分
3304
发表于 2014-3-15 11:29:46 | 显示全部楼层

不知道你的原始需求是什么。如果只是要列出不重复项,可以用 GROUP BY: [code][lang=sql,false]SELECT MIN(Num) AS

不知道你的原始需求是什么。如果只是要列出不重复项,可以用 GROUP BY:
  1. SELECT MIN(Num) AS Num, V1, F2
  2.     FROM DData
  3.     GROUP BY V1
  4.     ORDER BY Num
复制代码
回复

使用道具 举报

1

主题

15

帖子

120

积分

一级会员

Rank: 2

积分
120
 楼主| 发表于 2014-3-15 13:15:05 | 显示全部楼层

[i=s] 本帖最后由 AAuFuns 于 2014-3-15 13:17 编辑 [/i] [quote][size=2][url=forum.php?mod

本帖最后由 AAuFuns 于 2014-3-15 13:17 编辑
lujjjh 发表于 2014-3-15 11:29
不知道你的原始需求是什么。如果只是要列出不重复项,可以用 GROUP BY:

  1. SELECT MIN(Num) AS Num, V1, F2
  2.     FROM DData
  3.     GROUP BY V1
  4.     ORDER BY Num
复制代码



感谢你的答复。

Min() 不是求最小值吗?

原始需求是:当前记录的v1 和 前一条 记录的v1 相等。

如  第5条 和 第4条  的v1都是  7, 然后将 第5条 的 F2 修改为 1。

如果用 Min()  的话,返回的是 第4条,不符合要求。

因为是仅仅  和 前一条 记录  比较,所以,GROUP BY  列出不重复项   也不太合适,会列出其他不相邻的记录。

大侠,还有更简洁的SQL吗?

回复

使用道具 举报

12

主题

309

帖子

1798

积分

荣誉会员

Rank: 8Rank: 8

积分
1798
发表于 2014-3-15 17:55:51 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=65073&ptid=11733][c

AAuFuns 发表于 2014-3-15 13:15
感谢你的答复。

Min() 不是求最小值吗?

你是说了下一条,但是你没说“只能、仅仅”,所以别人大胆做假设了下。尽可能用最简单的话准确描述清楚问题,大家都很忙是吧。

至于“大侠,还有更简洁的SQL吗?” 这些话就不要说了,如果有人家知道想来早已经告诉你了,还需要你用这种方法去挤牙膏吗?经常看到一些新手提问追求都很“崇高”,“还能更简洁吗?” “还能更优雅吗?”,我一开始还挺佩服这些人,但是看多了,原来一些人是每天写着狗啃一样的代码对别人强调着优雅的目标(有感而发,不是说你)。

更简洁的SQL本人就不知道了,毕竟是你的问题,不是我的问题,也懒得去研究,不过你可以参考一下这个你是否还满意?
  1. UPDATE DData SET F2 = 1  
  2.    WHERE EXISTS(
  3.        SELECT 1 FROM DData AS DDataPrev WHERE DDataPrev.Num = DData.Num - 1 AND DDataPrev.V1 = DData.V1
  4.    );
复制代码

评分

参与人数 1银币 +5 收起 理由
hwqunt + 5 很给力!

查看全部评分

回复

使用道具 举报

33

主题

543

帖子

3304

积分

荣誉会员

Rank: 8Rank: 8

积分
3304
发表于 2014-3-15 19:28:18 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=65073&ptid=11733][c

AAuFuns 发表于 2014-3-15 13:15
感谢你的答复。

Min() 不是求最小值吗?

简洁的 SQL 语句未必高效。

按照你的需求很难写出高效的 SQL 语句,几乎没有人会这么设计功能(甚至可以说在程序里用个 table 改完之后再导回去可能更快),因此我对你的“原始需求”进行了猜测,即假设你最终只是想排除掉所有重复的数据

如果原始需求就是你说的那样,并且不介意效率的话,你写的 SQL 语句没有问题。如果想至少提高一点效率,可以为 Num 加上索引。
回复

使用道具 举报

1

主题

15

帖子

120

积分

一级会员

Rank: 2

积分
120
 楼主| 发表于 2014-3-15 23:21:16 | 显示全部楼层

感谢 auaau 和 lujjjh 的热心解答 由于数据库里 的记录 有很多条,导出到 再导回去,效率不会高的。 而且 [backcolor=L

感谢 auaau 和 lujjjh 的热心解答



由于数据库里 的记录 有很多条,导出到 再导回去,效率不会高的。
而且 特定条件 和可变的,我只是为了方便描述问题,才把 条件 简化为:  v1和前一条记录相等。

完整的描述是:  当前记录的 v1值 与 前第n条记录的v1 的  差值 等于某个指定值 d。

d 的取值范围: [-10 ,+10]

n 的取值范围: [+1 ,+100]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-15 15:48 , Processed in 0.078125 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表