如何在一个查询中执行此查询?

时间:2010-12-15 10:49:23

标签: sql

我不知道我想做什么是可能的,但我很好奇。

我有一张类似于

的时间表
timeTable
---------
_id
date

我有另一个表存储了timeinfo,它是timeTable的一个ForeignKey

myTable
-------
action
date_id

现在,我想要做的是用下个月同一日期的id更新date_id。

UPDATE myTable
SET date_id =  (SELECT date + interval '1 month' FROM timeTable INNER JOIN myTabe ON _id = date_id)
;

我知道这个查询无法正常工作,因为查询会返回一个期望uuid的日期。

我的问题:是否可以在没有anohter子查询的情况下使用一个查询检索下个月同一日期的date_id?我的实际查询我不知道怎么能这样做。有什么想法吗?

SELECT date + interval '1 month' FROM dimtime INNER JOIN roadmap ON _id = date_id

2 个答案:

答案 0 :(得分:0)

也许是这样的:

<强>被修改

UPDATE myTable t1
SET t1.date_id = (SELECT t2._id FROM timeTable t2 WHERE t2.date = (SELECT t3.date + interval '1 month' FROM timeTable t3 WHERE t3._id  = t1.date_id));

答案 1 :(得分:0)

这是一个令人讨厌的黑客攻击,但是如果你的RDBMS支持整数和日期数据类型之间的确定性转换,那么有一种方法可以在没有任何子查询的情况下完成此任务 - 但几乎可以肯定需要更改现有数据。

解决方案要求您使用日期的整数表示作为timeTable中的键(而不是任意指定的值)。如果您这样做,那么您可以执行日期计算,而无需从timeTable查找日期值。这样就无需在查询中包含timeTable(除非您需要验证新日期是否存在)。在这种情况下,查询的伪SQL将变为:

UPDATE myTable
SET date_id =  to_int(to_date(date_id) + interval `1 month`))
;

如果int&lt; - &gt;日期转换隐含在您的RDBMS中,它甚至更短:

UPDATE myTable
SET date_id =  date_id + interval `1 month`
;

但是,如果您正处于可以选择实施此设计的位置,那么最好放弃链接timeTable并在目标表中存储本机日期类型而不是整数FK。