2012-12-22 38 views
1

我有一個Access數據庫,由3個單獨的人員在場外使用;這個異地位置沒有網絡鏈接(也不可以)。使用時間戳合併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 

但由於它必須在色組獲得MAX功能,它仍然會創建索引的違規行爲。

那麼..我怎麼得到這個輸出?

+0

有趣的..但如果罐區的號碼,然後增加你會做什麼? – bonCodigo

+0

我正在使用一個VBA腳本,它動態地執行了很多事情;例如,實際上大約有20桌這樣做;我可以遍歷它們,使用Union查詢連接數據庫(如果需要,可以將更多的Unions循環到SQL中)。到目前爲止,這並不理想,但是由於客戶端的一堆需求,這就是它需要更新的方式。我只是沒有足夠的熟練用SQL來解決這個問題。最初我們剛剛告訴用戶「確保你不重複其他用戶」,但用戶並不總是在傾聽。 – StuckAtWork

+0

您或您想以哪種方式決定哪些重複數據是獲勝的數據?它是最新的時間戳嗎? – Nico

回答

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 
+0

我們走了......這是我在過去幾天試圖包攬頭部的東西。我會試試這個,在我看來它應該可以工作。 – StuckAtWork

+0

不可以。它似乎選擇不相同的條目(不只是項目,但如果顏色不同,它輸出兩個)。它正確放置MaxTime,但實際上只是將該字段粘貼到不正確(重複)行的末尾。 – StuckAtWork

+0

我沒有數據庫來測試...當你僅僅運行第二個查詢(內部連接之後的那個)時,你會得到什麼? - 你應該得到所需輸出中的5行,只是沒有顏色。 – ExactaBox

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: overread 「的MS Access」 - 這個人會是TSQL。對不起。儘管如此,也許你可以使用查詢來將其轉換爲有效的語法來訪問。

+0

我會給它一個鏡頭,但這似乎很像翻譯時@ ExactaBox的代碼。 – StuckAtWork

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 
+0

我認爲這會在Access中導致錯誤,因爲顏色沒有被聚合。我可能是錯的...... – ExactaBox

+0

確實會的;你不能在SELECT中(在Access中)與*進行聚合。雖然我想知道是否有按照這個順序的東西..也許使用「在這個查詢的輸出中選擇鍵的第一次出現」這種交易。 – StuckAtWork

+0

@StuckAtWork能不能請您在MS ACCESS中給這個提問並發表評論。 – bonCodigo

相關問題