2015-02-05 78 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。