来自两个连接表的独特记录,一个“不同”字段,控制日期

时间:2011-04-14 21:37:11

标签: sql ms-access ms-access-2007 distinct

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  

我想去的地方:
(正如我在另一个问题中所述,我认为这个问题过于通用而无法回答意图。我无法将选定的答案转换为使用两个表格,并且无法在分配的空间中添加注释以更详细地重新提问。)

基于TableA.ID的不同记录列表,如果IDx = IDy,则基于TableB.Date从TableB获得最新记录.Date产生重复项。

我希望这是可以理解的。

3 个答案:

答案 0 :(得分: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的输出仅限于每DateIDy s的行,这是通过一个狡猾的设备完成的,这需要将TableB加入自身并且搜索任何给定Date的行,其中没有比(更晚)更大的日期。

事实证明,它与John Gibb的解决方案基本相同,只涉及LEFT JOIN(第二个)+ WHERE key IS NULL而不是NOT EXISTS

答案 1 :(得分: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)

答案 2 :(得分:0)

根据评论,尝试将此连接断路器写为左连接。

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