1

我有一个 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 函数,因此它仍然会创建索引违规。

那么..我如何获得这个输出?

4

3 回答 3

2

您最初忽略了颜色,只是试图找到每个项目的最新时间戳。因此,您必须编写一个仅执行此操作的查询,然后您可以将它与整个表连接起来。

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
于 2012-12-22T01:36:15.397 回答
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的。对此感到抱歉。不过,也许您可​​以使用查询将其转换为有效的访问语法。

于 2012-12-22T01:40:15.267 回答
0

已编辑

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
于 2012-12-22T01:50:50.287 回答