1

我完全不知道如何完成这个查询。

如何在没有大的性能影响的情况下实现此查询(如果表包含数千行)?

请指教!

我的表

pktimestmp | sw_id | url_id |  open_date   | end_date  
-------------------------------------------------------
xxx0       |  101  |  com   |  2013-01-01  | 2013-01-30
xxx1       |  202  |  net   |  2013-01-01  | 2013-01-30
xxx2       |  202  |  net   |  2013-01-15  | 2013-02-28 *
xxx3       |  303  |  com   |  2013-01-01  | 2013-01-30 
xxx4       |  303  |  com   |  2013-02-01  | 2013-02-15 *
xxx5       |  303  |  com   |  2013-03-01  | 2013-03-15 *
xxx6       |  404  |  org   |  2013-01-01  | 2013-01-30 
xxx7       |  404  |  org   |  2013-02-01  | 2013-02-15 *
xxx8       |  404  |  gov   |  2013-02-01  | 2013-02-15
xxx9       |  404  |  gov   |  2013-02-01  | 2013-02-15 

...

更新查询:

软件和 url 相同的日期(即 sw_id 和 url_id)。

我们将 opendate 和 enddate 设置为较少(分钟)出现。

xxx2       |  202  |  net   |  2013-01-15  | 2013-02-28
will be
xxx2       |  202  |  net   |  2013-01-01  | 2013-01-30 

here we have updated 
open_date to min(open_date)
and 
end_date to min(end_date)
from same sw and url.

(如果我们只更新有差异的地方就好了,例如不需要更新 xxx8 和 xxx9 因为它们是“相同的”)

MyTable (* = 更新的行)

pktimestmp | sw_id | url_id |  open_date   | end_date
-------------------------------------------------------
xxx0       |  101  |  com   |  2013-01-01  | 2013-01-30
xxx1       |  202  |  net   |  2013-01-01  | 2013-01-30
xxx2       |  202  |  net   |  2013-01-01  | 2013-01-30 *
xxx3       |  303  |  com   |  2013-01-01  | 2013-01-30 
xxx4       |  303  |  com   |  2013-01-01  | 2013-01-30 *
xxx5       |  303  |  com   |  2013-01-01  | 2013-01-30 *
xxx6       |  404  |  org   |  2013-01-01  | 2013-01-30 
xxx7       |  404  |  org   |  2013-01-01  | 2013-01-30 *
xxx8       |  404  |  gov   |  2013-02-01  | 2013-02-15
xxx9       |  404  |  gov   |  2013-02-01  | 2013-02-15 

提前致谢!(不,我无权重新建模表格):)

任何帮助表示赞赏,网址,提示,电子书,网站......

4

1 回答 1

1

以下应该可以工作(几乎在任何 RDBMS 上):

UPDATE MyTable as a SET (open_date, close_date) 
                        = (SELECT MIN(open_date), MIN(close_date)
                           FROM MyTable as b
                           WHERE b.sw_id = a.sw_id
                             AND b.url_id = a.url_id)
WHERE EXISTS (SELECT *
              FROM MyTable as b
              WHERE b.sw_id = a.sw_id
                AND b.url_id = a.url_id
                AND (b.open_date < a.open_date OR b.close_date < a.close_date))

它生成了预期的,仅更新了 4 行(针对我的 iSeries 实例进行了测试):

PKTIMESTAMP         SW_ID  URL_ID  OPEN_DATE   CLOSE_DATE
xxx0                101    com     2013-01-01  2013-01-30
xxx1                202    net     2013-01-01  2013-01-30
xxx2                202    net     2013-01-01  2013-01-30
xxx3                303    com     2013-01-01  2013-01-30
xxx4                303    com     2013-01-01  2013-01-30
xxx5                303    com     2013-01-01  2013-01-30
xxx6                404    org     2013-01-01  2013-01-30
xxx7                404    org     2013-01-01  2013-01-30
xxx8                404    gov     2013-02-01  2013-02-15
xxx9                404    gov     2013-02-01  2013-02-15
于 2013-01-23T20:41:34.670 回答