MYSQL 一个SQL语句问题

xinzaibing 发布于 2012/07/13 15:30
阅读 610
收藏 1

我在ORACLE数据库下有一句SQL语句:

DELETE FROM TABLE_1 A

WHERE A.PERIOD < ABS(SELECT SYSDATE-B.TIME)

                            FROM TABLE_1 B

                            WHERE A.ID1=B.ID1 AND A.ID2=B.ID2)*24*60*60;

 

MYSQL 5.5 下无法执行,报语法错误。

表结构:

TABLE_1:   ID1 INT;

                ID2 INT;

                PERIOD INT;

                TIME DATETIME;

 

求大侠解救!!

加载中
0
逝水fox
逝水fox

select sysdate - b.time from table_1 as b where a.id1 = b.id1 and a.id2 = b.id2

这个语句沒看懂要做什么事情,如果a和b都是table_1的话,你这里返回的至少有个当前a搜索到的这条记录在b里面就满足a.id1=b.id1 a.id2=b.id2了,另外还可能有其他的记录的话,这个子查询返回就不止一行了,可以直接用abs然后<判断吗?

另外mysql里面系统时间用now()返回

泡不烂的凉粉
泡不烂的凉粉
回复 @逝水fox : 问题应该是求思路。 我的思路没有错就好。
逝水fox
逝水fox
回复 @看能不能改个名 : 你的对的啊...只是不知道他里面数据是不是要精确到秒还是只是精确到天的而已,所以我按照他提供代码里面的原样datediff算了天之后再乘回秒数而已。直接减是个单位为秒的浮点数。
泡不烂的凉粉
泡不烂的凉粉
回复 @xinzaibing : 最终的查询语句是什么。 为什么我的答案落选。
xinzaibing
xinzaibing
回复 @逝水fox : 按你的方法搞定!!非常感谢。。。不过还剩下几千行的SQL语句没改,。。。。我擦。。。
逝水fox
逝水fox
回复 @xinzaibing : 我的错 delete from tt where abs(datediff(sysdate(),tt.time)) * 24 * 60 * 60 > tt.period; 不要别名就可以了
下一页
1
宏哥
宏哥

To be frank:

你现在更换数据库到PG,可能比你解决mysql 内生问题更节约时间. 

很多问题已经被证明是无法解决的.

你可以评估一下成本. 如果用enterpriseDB可以兼容90%以上的oracle操作.

有很多集合运算,涉及差,嵌套, 在mysql是没有办法完成的.

泡不烂的凉粉
泡不烂的凉粉
@宏哥 厂小,女的少,泡不到妞!
StormFour
StormFour
回复 @xinzaibing : 恩,有这功夫还不如换数据库呢
宏哥
宏哥
回复 @看能不能改个名 : 这只是其中一个. 还有得搞呢.
泡不烂的凉粉
泡不烂的凉粉
@宏哥 不要再宣传更换数据库了。 问题就是问题。 虽然更换是解决问题的一种方式, 可问题是 MYSQL 能不能做这些。 不能因为 它功能弱就不解决它所遇见的问题啊。
xinzaibing
xinzaibing
是啊。。坑爹啊!! 遇到好多嵌套的查询不能用了。。只能改存储过程。。。
0
xinzaibing
xinzaibing

更正一下SQL语句,少打了两个括号

DELETE FROM TABLE_1 A

WHERE A.PERIOD < ABS((SELECT SYSDATE-B.TIME

                            FROM TABLE_1 B

                            WHERE A.ID1=B.ID1 AND A.ID2=B.ID2)*24*60*60);

0
宏哥
宏哥
如果可以执行,它就不是mysql 了.
xinzaibing
xinzaibing
求解决方案!~~
0
宏哥
宏哥
为啥要用mysql? 扔了它,不就啥事没有?
宏哥
宏哥
回复 @xinzaibing : 那我也没有办法,只能祝你好运!
xinzaibing
xinzaibing
回复 @宏哥 :PostgreSQL?不行啊...已经搞到一半多了,,进退两难...
宏哥
宏哥
回复 @xinzaibing : PG
xinzaibing
xinzaibing
考虑到价格问题..上不起啊。。 ORACLE往mysql迁移....
0
小扈
小扈

引用来自“xinzaibing”的答案

更正一下SQL语句,少打了两个括号

DELETE FROM TABLE_1 A

WHERE A.PERIOD < ABS((SELECT SYSDATE-B.TIME

                            FROM TABLE_1 B

                            WHERE A.ID1=B.ID1 AND A.ID2=B.ID2)*24*60*60);

我感觉你的查询语句是不是少写了一个表A呀
xinzaibing
xinzaibing
没有呀,表A就是TABLE_1,表B也是TABLE_1。 通过自身的值删除自身的一些数据
0
小扈
小扈

引用来自“大家都叫我小扈”的答案

引用来自“xinzaibing”的答案

更正一下SQL语句,少打了两个括号

DELETE FROM TABLE_1 A

WHERE A.PERIOD < ABS((SELECT SYSDATE-B.TIME

                            FROM TABLE_1 B

                            WHERE A.ID1=B.ID1 AND A.ID2=B.ID2)*24*60*60);

我感觉你的查询语句是不是少写了一个表A呀

我还是感觉不太对 from 语句后面我感觉应该再写点东西  类似于 FROM table_1 A,table_1 B之类的

小扈
小扈
回复 @xinzaibing : 那我就没办法了 我也不知道肿么个情况
xinzaibing
xinzaibing
你可以用ORACLE数据库试试,完全正确的...但是在MYSQL下就跑不了了...
0
泡不烂的凉粉
泡不烂的凉粉

引用来自“xinzaibing”的答案

更正一下SQL语句,少打了两个括号

DELETE FROM TABLE_1 A

WHERE A.PERIOD < ABS((SELECT SYSDATE-B.TIME

                            FROM TABLE_1 B

                            WHERE A.ID1=B.ID1 AND A.ID2=B.ID2)*24*60*60);

SYSDATE-B.TIME 这个是什么。  SYSDATE 是系统关键字?还是表字段。
0
泡不烂的凉粉
泡不烂的凉粉

这个SQL语句功能是:计算当前时间和表里的time字段时间戳的秒数差值,看是否大于period,大于的话就把这条数据删掉

如果是这样的需求,何必那么麻烦啊, delete from A where A.PERIOD < ABS(now() - A.TIME)) 不行吗?

泡不烂的凉粉
泡不烂的凉粉
回复 @xinzaibing : “表中的字段不能用于where语句中的计算” 为什么不能计算呢? 不如把你的需求写清楚,看来我没明白你的需求。
xinzaibing
xinzaibing
还是不行,第一个问题:MYSQL的SQL的语句貌似不支持delete from table A where... 也就是说不能把tables更名为A 第二 ,表中的字段不能用于where语句中的计算。。
0
新人王
新人王
写存储过程吧,否则。。。。
返回顶部
顶部