报告的Sybase SQL脚本

时间:2015-04-09 00:33:36

标签: sql join sybase

我试图整理一个SQL脚本,它会在一个脚本中提供以下信息: Node,lastUpdatedTime,bytesWritten

从domain_Client我想用最新的lastUpdatedTime取出Node。

From "domain_Client" table:
Node        lastUpdatedTime
Server1     04042015
Server1     04082015
Server2     04072015
Server2     04062015

我在domain_JobArchive中找到了另一个包含bytesWritten和lastUpdatedTime的表(而不是只有bytesWritten的旧domain_Jobs)。

From "domain_JobArchive" table:
bytesWritten    lastUpdatedTime
1000            04042015
2000            04082015
3000            04072015
4000            04062015

期望的结果:

Node        lastUpdatedTime     bytesWritten
Server1     04082015            2000
Server2     04072015            3000

到目前为止,我已经能够使用以下脚本查询Node和lastUpdatedTime:

select
node, lastUpdatedTime
from domain_Client a
where lastUpdatedTime = (select max(lastUpdatedTime) from domain_Client b
where a.node = b.node

我坚持如何在脚本中包含bytesWritten。

我是Sybase SQL的初学者,所以我们将不胜感激。谢谢。

那么现在如何将bytesWritten合并到上面的现有脚本中?

1 个答案:

答案 0 :(得分:0)

在介绍解决方案之前。我假设domain_Client中的每个记录在domain_Jobs中都有一个隐含记录:每次在domain_Client中插入记录时,domain_Jobs中都会插入另一条记录最后插入的记录显示在选择结果的顶部,否则有解决方案。

我使用Oracle是因为sqlfiddle中没有Sybase数据库支持。 你可以用它作为灵感。请注意,我没有优化查询,因此您需要进行一些调整。

为了能够做您想做的事情,您必须在domain_Clientdomain_Jobs中加入一个加入列。因此,我们将向表中添加一个新列(可能您应该创建表的副本并对其进行修改)。

Alter table domain_Client add join_col number;
Alter table domain_Jobs add join_col number;

之后创建两个序列:

Alter table domain_Client add join_col number;
Alter table domain_Jobs add join_col number;

更新两个表上的join_col

update  domain_Client set join_col = cli_seq.nextval; 
update  domain_Jobs set join_col = cli_jobs.nextval; 

现在我们可以在两个表之间进行连接并获得结果:

SELECT vb.node,
   va.maxupdatetime,
   vb.bytesWritten
FROM
( SELECT node,
         max(LASTUPDATEDTIME) maxupdatetime
 FROM domain_Client
  GROUP BY node) va
INNER JOIN
( SELECT node,
   lastUpdatedTime,
   bytesWritten
 FROM domain_Client a
 INNER JOIN domain_JobArchive b ON a.LASTUPDATEDTIME = b.LASTUPDATEDTIME) vb      ON va.node = vb.node
 AND va.maxupdatetime = vb.lastUpdatedTime

以下是fiddle

的链接