使用时间戳组合3个相同的表

时间:2012-12-22 01:13:38

标签: sql ms-access timestamp

我有一个Access数据库,由3个不同的人在场外使用;这个场外位置没有网络链接(也不能)。

我有三个相同的数据库,因此有三个相同的表。每个用户使用相同的主键填写信息。对于这个“食品评估”的例子:

Item       |      Color       | Timestamp

PERSON 1 (first database)
Carrot     |     Orange       | 2012-12-21 13:00:00
Watermelon |     Red          | 2012-12-21 19:00:00 <--
Blueberry  |     Blue         | 2012-12-21 17:00:00 <--

PERSON 2 (second database)
Carrot     |     Yellow       | 2012-12-21 15:00:00 <--
Apple      |     Green        | 2012-12-21 15:00:00 <--

PERSON 3 (third database)
Watermelon |     Green        | 2012-12-21 11:00:00 
Apple      |     Red          | 2012-12-21 14:00:00
Orange     |     Orange       | 2012-12-21 15:00:00 <--

我需要输出一个表:

Blueberry  |     Blue         | 2012-12-21 17:00:00
Watermelon |     Red          | 2012-12-21 19:00:00
Carrot     |     Yellow       | 2012-12-21 15:00:00
Apple      |     Green        | 2012-12-21 15:00:00
Orange     |     Orange       | 2012-12-21 15:00:00

因此,基于时间戳,我只需要选择其中一个重复项,但也要包含所有非重复项(项目是主键,唯一键)。我只是不能为我的生活得到这个SQL .. 使用

SELECT Item, Color, MAX(timestamp) 
FROM (SELECT ... FROM first 
UNION SELECT ... FROM second
UNION SELECT ... FROM third)
GROUP BY Item, Color

但是因为它必须在Color上进行分组以获得MAX函数,所以它仍会产生索引违规。

那么......我怎么得到这个输出?

3 个答案:

答案 0 :(得分:2)

你最初忽略了Color,只是试图找到每个Item的最新时间戳。因此,您必须编写仅执行此操作的查询,然后可以使用完整表格加入它。

select a.Item, a.Color, a.Timestamp

from
(SELECT ... FROM first 
UNION SELECT ... FROM second
UNION SELECT ... FROM third) a

inner join

(SELECT Item, MAX(timestamp) as MaxTime
FROM (SELECT ... FROM first 
UNION SELECT ... FROM second
UNION SELECT ... FROM third) z
GROUP BY Item) b

on a.Item = b.Item and a.Timestamp = b.MaxTime

答案 1 :(得分:1)

这将为您提供估算结果:

create table t1 ( food nvarchar(20), color nvarchar(10), timestamp datetime );
create table t2 ( food nvarchar(20), color nvarchar(10), timestamp datetime );
create table t3 ( food nvarchar(20), color nvarchar(10), timestamp datetime );

insert into t1 values 
( 'Carrot', 'Orange', '2012-12-21T13:00:00' ), 
( 'Watermelon', 'Red', '2012-12-21T19:00:00' ), 
( 'Blueberry', 'Blue', '2012-12-21T17:00:00' );

insert into t2 values 
( 'Carrot', 'Yellow', '2012-12-21T15:00:00' ), 
( 'Apple', 'Green', '2012-12-21T15:00:00' );

insert into t3 values 
( 'Watermelon', 'Green', '2012-12-21T11:00:00' ), 
( 'Apple', 'Red', '2012-12-21T14:00:00' ), 
( 'Orange', 'Orange', '2012-12-21T15:00:00' );

with "data"
as 
(
    select * from t1 
    union all select * from t2 
    union all select * from t3
)
, "maxdata"
as
(
    select
        *,
        latest = MAX( "timestamp" ) over ( partition by "food" )
    from
        data
)
select 
    "food", "color", "timestamp"
from 
    maxdata
where
    "timestamp" = "latest"

@edit:重读“ms access” - 这个将用于tsql。对不起尽管如此,也许您可​​以使用查询将其转换为有效的语法以进行访问。

答案 2 :(得分:0)

<强> EDITED

MS Access的一个好处是查询查询。您可以将联合保存到查询中。把它当作你的主要餐桌。按项目和最大日期分组的另一个查询。加入他们。

或者进行第二次查询以仅返回最大日期并使用IN运算符使用不同的项目;-)


答案在ANSI SQL中,因此您可以合并到MS ACCESS中。你需要的只是一个联盟,然后将它分组:)

查询:

select x.*, max(x.TimeStamp) 
from (
select * from person1
union all
select * from person2
union all
select * from person3) as x
group by x.Item
order by x.TimeStamp asc
;

结果:

ITEM        COLOR   MAX(X.TIMESTAMP)
Carrot      Orange  December, 21 2012 15:00:00+0000
Apple       Green   December, 21 2012 15:00:00+0000
Orange      Orange  December, 21 2012 15:00:00+0000
Blueberry   Blue    December, 21 2012 17:00:00+0000
Watermelon  Red     December, 21 2012 19:00:00+0000