2015-02-05 58 views
2

我在數據庫1SQL Server的最大值檢索

create table database1..Table1 (id int ,datestamp datetime) 
create table database1..Table2 (id int ,datestamp datetime) 
create table database1..Table3(id int ,datestamp datetime) 

以下3個表,該表中DATABASE2

create table database2..Table1 (id int ,datestamp datetime) 

我想的更大的值更新DATABASE2的表1 .datestamp datestamp(在數據庫1的3個表之間)

是否有比此查詢更好的方法(不使用大小寫):

update db2t1 
set datestamp= 
case when db1t1.datestamp > db1t2.datestamp and db1t1.datestamp > db1t3.datestamp then db1t1.datestamp 
     when db1t2.datestamp > db1t1.datestamp and db1t2.datestamp > db1t3.datestamp then db1t2.datestamp 
     else db1t3.datestamp 
    end 
from database2..Table1 db2t1 inner join database1..Table1 db1t1 on db2t1.id=db1t1.id 
inner join database1..Table2 db1t2 on db1t1.id=db1t2.id 
inner join database1..Table3 db1t3 on db1t1.id=db1t2.id 

這個查詢將在一個巨大的表

+0

在'db1t1.datestamp'和'db1t2.datestamp'相等的情況下,即使它低於另外兩個,也會將該值設置爲db1t3.datestamp。 – TZHX 2015-02-05 13:18:55

+0

這幾乎是你如何做到這一點(銘記TZHX的說法,並且如果你爲自己設定價值,你可能會省下一點努力)。如果這些表格在id上鍵入,你會很難按照數據的大小做出很大的改變。 – Xedni 2015-02-05 13:21:55

回答

0

執行也許你可以做這樣的事情:

UPDATE db2t1 
SET db2t1.datestamp = tbl2.MaxDate 
from database2..Table1 db2t1 
JOIN 
(
    SELECT 
     MAX(tbl.datestamp) AS MaxDate, 
     tbl.id 
    FROM 
    (
     SELECT id,datestamp database1..Table1 UNION ALL 
     SELECT id,datestamp database1..Table2 UNION ALL 
     SELECT id,datestamp database1..Table3 
    ) AS tbl 
    GROUP BY 
     tbl.id 
) AS tbl2 
ON tbl2.id=db2t1.id 
+0

很酷的查詢 – pizzaslice 2016-12-24 19:15:23

0

你做這個大表的任何方式將是困難的。我會拆到這個批次(基於ID假定它是聚集鍵的範圍),並修改查詢是這樣的:

UPDATE T1 
SET dateStamp = X.dateStamp 
FROM database2..Table1 T1 
JOIN (SELECT ID, MAX(dateStamp) dateStamp 
    FROM (
      SELECT ID, dateStamp 
      FROM table2 T2 
      UNION ALL 
      SELECT ID, dateStamp 
      FROM table3 T3 
     ) N 
    GROUP BY ID) X ON X.ID = T1.ID 
WHERE X.dateStamp > T1.dateStamp 

爲了減少T1被鎖定,你可以把派生表到時間一個臨時表,然後從結果中更新T1。