删除数据库指定条件的数据问题

hul19830820 2009-09-14 02:02:49
现在数据库结构:

time data1
2009-9-13 13:00:00 1.5
2009-9-13 13:05:00 2.5
2009-9-13 13:10:00 3.5
2009-9-13 13:15:00 2.5
2009-9-13 13:20:00 4.5
2009-9-13 13:25:00 5.5
2009-9-13 13:30:00 6.5
2009-9-13 13:35:00 5.5
2009-9-13 13:40:00 5.5
本来应该 后一个时间的数据比前一个时间的数据大,但是现在出现了小的情况
需要把小的记录删除 求一个循环结构

...全文
275 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lidanzi 2009-09-15
  • 打赏
  • 举报
回复

DECLARE @TB TABLE([time] DATETIME, [data1] DECIMAL(10,2))
INSERT @TB
SELECT '2009-9-13 13:00:00', 1.5 UNION ALL
SELECT '2009-9-13 13:05:00', 2.5 UNION ALL
SELECT '2009-9-13 13:10:00', 3.5 UNION ALL
SELECT '2009-9-13 13:15:00', 2.5 UNION ALL
SELECT '2009-9-13 13:20:00', 4.5 UNION ALL
SELECT '2009-9-13 13:25:00', 5.5 UNION ALL
SELECT '2009-9-13 13:30:00', 6.5 UNION ALL
SELECT '2009-9-13 13:35:00', 5.5 UNION ALL
SELECT '2009-9-13 13:40:00', 5.5


delete @TB
from @TB a
where data1<>(select max(data1) from @TB b where a.time>=b.time)
select * from @TB
zhangjiang264 2009-09-15
  • 打赏
  • 举报
回复
像 2009-9-13 13:30:00 6.5 这条记录
如果与前面开始比较,它不会被删除
如果与后面开始比较,它会被删除
zhangjiang264 2009-09-15
  • 打赏
  • 举报
回复
我试过了,两个执行结果不一样的。(因为执行顺序不一样啊)
你可以试一下啊。
hul19830820 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhangjiang264 的回复:]
引用 9 楼 hul19830820 的回复:
引用 6 楼 xiaoliaoyun 的回复:
这个正确,就是从T表中删除存在TIME比该记录小,但是DATA1比该记录大的

SQL codeDELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME <T.TIMEAND DATA1>T.DATA1)

引用 5 楼 hul19830820 的回复:
引用 4 楼 zhangjiang264 的回复:
SQL codedelete tbfrom tb  twhereexists(select1from tbwhere time>t.timeand data1 <t.data1)DELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME <T.TIMEAND DATA1>T.DATA1)
这两个查询结果执行书序不大一样。

为什么不一样啊,能解释一下原因吗?哪个好?结果都一样吧


还是没告诉我原因啊。大哥

这两个子查询执行的顺序不一样啊。结果也不一样。
每当选定一条父记录,一个总是和前面的记录比较,一个总是和后面的记录比较。删除的记录也不一样。
你还是根据你的实际情况选择吧。


[/Quote]大哥我要的是把所有的不符合条件的记录都删除啊,两者结果应该一样吧。
zhangjiang264 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hul19830820 的回复:]
引用 6 楼 xiaoliaoyun 的回复:
这个正确,就是从T表中删除存在TIME比该记录小,但是DATA1比该记录大的

SQL codeDELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME <T.TIMEAND DATA1>T.DATA1)

引用 5 楼 hul19830820 的回复:
引用 4 楼 zhangjiang264 的回复:
SQL codedelete tbfrom tb  twhereexists(select1from tbwhere time>t.timeand data1 <t.data1)DELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME <T.TIMEAND DATA1>T.DATA1)
这两个查询结果执行书序不大一样。

为什么不一样啊,能解释一下原因吗?哪个好?结果都一样吧


还是没告诉我原因啊。大哥
[/Quote]
这两个子查询执行的顺序不一样啊。结果也不一样。
每当选定一条父记录,一个总是和前面的记录比较,一个总是和后面的记录比较。删除的记录也不一样。
你还是根据你的实际情况选择吧。


hul19830820 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaoliaoyun 的回复:]
这个正确,就是从T表中删除存在TIME比该记录小,但是DATA1比该记录大的

SQL codeDELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME<T.TIMEAND DATA1>T.DATA1)

引用 5 楼 hul19830820 的回复:
引用 4 楼 zhangjiang264 的回复:
SQL codedelete tbfrom tb  twhereexists(select1from tbwhere time>t.timeand data1 <t.data1)DELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME <T.TIMEAND DATA1>T.DATA1)
这两个查询结果执行书序不大一样。

为什么不一样啊,能解释一下原因吗?哪个好?结果都一样吧

[/Quote]
还是没告诉我原因啊。大哥
战斗生活 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
SQL code----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-09-14 14:06:40
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]ifobject_id('[tb]')isnotnulldroptable[tb]gocreatetable[tb]([time]datetime,[data1] numeric(2,1))insert[tb]select'2009-9-13 13:00:00',1.5unionallselect'2009-9-13 13:05:00',2.5unionallselect'2009-9-13 13:10:00',3.5unionallselect'2009-9-13 13:15:00',2.5unionallselect'2009-9-13 13:20:00',4.5unionallselect'2009-9-13 13:25:00',5.5unionallselect'2009-9-13 13:30:00',6.5unionallselect'2009-9-13 13:35:00',5.5unionallselect'2009-9-13 13:40:00',5.5--------------开始查询--------------------------DELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME<T.TIMEAND DATA1>T.DATA1)select*from tb----------------结果----------------------------
/*time data1
----------------------- ---------------------------------------
2009-09-13 13:00:00.000 1.5
2009-09-13 13:05:00.000 2.5
2009-09-13 13:10:00.000 3.5
2009-09-13 13:20:00.000 4.5
2009-09-13 13:25:00.000 5.5
2009-09-13 13:30:00.000 6.5

(6 行受影响)*/
[/Quote]

很好的做法
xiaoliaoyun 2009-09-14
  • 打赏
  • 举报
回复
这个正确,就是从T表中删除存在TIME比该记录小,但是DATA1比该记录大的


DELETE TB FROM TB T WHERE EXISTS(SELECT 1 FROM TB WHERE TIME <T.TIME AND DATA1>T.DATA1)


[Quote=引用 5 楼 hul19830820 的回复:]
引用 4 楼 zhangjiang264 的回复:
SQL codedelete tbfrom tb  twhereexists(select1from tbwhere time>t.timeand data1 <t.data1)DELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME <T.TIMEAND DATA1>T.DATA1)
这两个查询结果执行书序不大一样。

为什么不一样啊,能解释一下原因吗?哪个好?结果都一样吧
[/Quote]
hul19830820 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhangjiang264 的回复:]
SQL codedelete tbfrom tb twhereexists(select1from tbwhere time>t.timeand data1<t.data1)DELETE TBFROM TB TWHEREEXISTS(SELECT1FROM TBWHERE TIME<T.TIMEAND DATA1>T.DATA1)
这两个查询结果执行书序不大一样。
[/Quote]
为什么不一样啊,能解释一下原因吗?哪个好?结果都一样吧
zhangjiang264 2009-09-14
  • 打赏
  • 举报
回复

delete tb from tb t where exists(select 1 from tb where time>t.time and data1<t.data1)
DELETE TB FROM TB T WHERE EXISTS(SELECT 1 FROM TB WHERE TIME<T.TIME AND DATA1>T.DATA1)

这两个查询结果执行书序不大一样。
csdyyr 2009-09-14
  • 打赏
  • 举报
回复
DECLARE @TB TABLE([time] DATETIME, [data1] DECIMAL(10,2))
INSERT @TB
SELECT '2009-9-13 13:00:00', 1.5 UNION ALL
SELECT '2009-9-13 13:05:00', 2.5 UNION ALL
SELECT '2009-9-13 13:10:00', 3.5 UNION ALL
SELECT '2009-9-13 13:15:00', 2.5 UNION ALL
SELECT '2009-9-13 13:20:00', 4.5 UNION ALL
SELECT '2009-9-13 13:25:00', 5.5 UNION ALL
SELECT '2009-9-13 13:30:00', 6.5 UNION ALL
SELECT '2009-9-13 13:35:00', 5.5 UNION ALL
SELECT '2009-9-13 13:40:00', 5.5

DELETE T
FROM @TB AS T
WHERE EXISTS(SELECT * FROM @TB WHERE TIME<T.TIME AND DATA1>T.DATA1)

SELECT *
FROM @TB
/*
time data1
------------------------------------------------------ ------------
2009-09-13 13:00:00.000 1.50
2009-09-13 13:05:00.000 2.50
2009-09-13 13:10:00.000 3.50
2009-09-13 13:20:00.000 4.50
2009-09-13 13:25:00.000 5.50
2009-09-13 13:30:00.000 6.50
*/
--小F-- 2009-09-14
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-09-14 14:06:40
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([time] datetime,[data1] numeric(2,1))
insert [tb]
select '2009-9-13 13:00:00',1.5 union all
select '2009-9-13 13:05:00',2.5 union all
select '2009-9-13 13:10:00',3.5 union all
select '2009-9-13 13:15:00',2.5 union all
select '2009-9-13 13:20:00',4.5 union all
select '2009-9-13 13:25:00',5.5 union all
select '2009-9-13 13:30:00',6.5 union all
select '2009-9-13 13:35:00',5.5 union all
select '2009-9-13 13:40:00',5.5
--------------开始查询--------------------------
DELETE TB FROM TB T WHERE EXISTS(SELECT 1 FROM TB WHERE TIME<T.TIME AND DATA1>T.DATA1)
select * from tb
----------------结果----------------------------
/*time data1
----------------------- ---------------------------------------
2009-09-13 13:00:00.000 1.5
2009-09-13 13:05:00.000 2.5
2009-09-13 13:10:00.000 3.5
2009-09-13 13:20:00.000 4.5
2009-09-13 13:25:00.000 5.5
2009-09-13 13:30:00.000 6.5

(6 行受影响)
*/
SQL77 2009-09-14
  • 打赏
  • 举报
回复
DELETE TB FROM TB T WHERE EXISTS(SELECT 1 FROM TB WHERE TIME<T.TIME AND DATA1>T.DATA1)
?

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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