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 

前もって感謝します!(そして、テーブルを再モデル化する権利はありません):)

URL、ヒント、電子ブック、サイトなど、どんな助けでも大歓迎です...

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 に答える