2011-04-14 53 views
3

Access 2007年區分記錄,控制日期

TableA 
IDx  Filename 

TableB 
IDy  Date  Name 

有表B中更多的領域,但這應該工作。
IDy不是唯一的,可能有重複。 IDx是唯一的,沒有重複。

我開始什麼用:

SELECT TableA.IDx, TableA.Filename, TableB.Date, TableB.Name 
FROM TableA LEFT JOIN TableB ON TableA.IDx = TableB.IDy 

當我試圖去:
(正如我的其他問題,我認爲是過於籠統回答的意圖說我不能轉換當選的答案基於表B兩個表工作,不能在分配的空間添加評論更多的細節來重新問這個問題。)的基礎上TableA.ID目前大多數的記錄表B從不同的記錄

名單。如果IDx = IDy,則產生重複。

我希望這是可以理解的。

+2

試圖理解。如果你發佈了兩個表的數據(每行幾行),然後得到所需的視覺輸出,你會得到更快的響應...... – 2011-04-14 22:02:05

回答

3

像這樣的東西或許應該解決您的問題:

SELECT a.IDx, a.Filename, b1.Date, b1.Name 
FROM ((TableA AS a) 
    LEFT JOIN TableB AS b1 ON a.IDx = b1.IDy) 
    LEFT JOIN TableB AS b2 ON b1.IDy = b2.IDy AND b1.Date < b2.Date 
WHERE b2.IDy IS NULL 

TableB的輸出限制到僅與最新Date S中的行,每IDy通過一個狡猾的設備,其中包括加盟做TableB回到自己並搜索任何給定的行Date沒有日期大於(稍後)。

原來,它與John Gibb的解決方案基本相同,只涉及LEFT JOIN(第二個)+ WHERE key IS NULL而不是NOT EXISTS

+0

不幸的是,Access不會接受第二個LEFT JOIN語句。 (語法錯誤,缺少運算符) – Mhonzell 2011-04-18 11:43:53

+0

@Monzell:固定(缺少必要的缺口)。 – 2011-04-18 11:56:09

+0

括號中的內容現在可以用作John Gibb的解決方案,因爲它不會過濾任何內容。 (包括所有記錄。)但是...如果在第一個SELECT之後放置DISTINCT這個詞,那麼它按照要求工作。 – Mhonzell 2011-04-18 13:49:06

0

不知道這是否會在MS Access工作,但值得給它一個嘗試:根據意見

SELECT TableA.IDx, TableA.Filename, TableB.Date, TableB.Name 
FROM TableA, TableB 
WHERE TableA.Idx in (SELECT DISTINCT TableB.IDy FROM TableB) 
0

,嘗試寫爲左加入這個決勝局。

select * 
from TableA a 
left join TableB b 
    on b.idy = a.idx 
    and b.date < a.date 
where b.idy is null 
+0

'outer apply'不是Access/Jet/ACE兼容的SQL。 – 2011-04-18 05:45:27

+0

在Jet/ACE中,NOT EXISTS(以及NOT IN)沒有很好的優化,因爲它不能可靠地利用雙方的索引。在大多數情況下,外部JOIN將會更好,因爲它總是使用索引。 – 2011-04-18 05:46:33

+0

我不相信外部應用程序在Access中工作。在第二個版本中,這種格式被接受,但會產生包含所有記錄的記錄列表。沒有發生過濾。 – Mhonzell 2011-04-18 11:44:51