【问题标题】:Distinct record from two joined tables, one "distinct" field, controlling date来自两个连接表的不同记录,一个“不同”字段,控制日期
【发布时间】:2011-04-14 21:37:10
【问题描述】:

访问 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  

我想去的地方:
(正如我在另一个问题中所述,我认为这太笼统而无法回答意图。我无法将选定的答案转换为使用两个表格,也无法在分配的空间中添加评论以更详细地重新提出问题.)

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

我希望这是可以理解的。

【问题讨论】:

  • 试图理解。如果您为两个表(每张几行)发布一些数据,然后发布所需的视觉输出,您将获得更快的响应......

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


【解决方案1】:

这样的事情应该可以解决你的问题:

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

将每个IDyTableB 的输出限制为仅具有最新Dates 的行是通过一个狡猾的设备完成的,其中包括将TableB 连接回自身并搜索其中有任何行的行鉴于Date,没有比这更大(晚)的日期。

原来,这和John Gibb的解决方案基本一样,只是它涉及LEFT JOIN(第二个)+WHERE key IS NULL而不是NOT EXISTS

【讨论】:

  • 很遗憾,Access 将不接受第二个 LEFT JOIN 语句。 (语法错误,缺少运算符)
  • @Mhonzell:已修复(缺少所需的括号)。
  • 使用括号,这现在可以作为 John Gibb 的解决方案的行为,因为它不过滤任何内容。 (包括所有记录。)但是......如果单词 DISTINCT 放在第一个 SELECT 之后,那么这将按要求工作。
【解决方案2】:

不确定这是否适用于 MS Access,但值得一试:

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

【讨论】:

    【解决方案3】:

    基于 cmets,试试这个写成左连接的决胜局。

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

    【讨论】:

    • outer apply 不是 Access/Jet/ACE 兼容的 SQL。
    • NOT EXISTS(以及 NOT IN)在 Jet/ACE 中没有得到很好的优化,因为它不能可靠地利用两边的索引。在大多数情况下,外部 JOIN 会更可取,因为它将始终使用索引。
    • 我不相信 OUTER APPLY 在 Access 中有效。在第二个版本中,这种格式被接受,但会产生一个包含所有记录的记录列表。没有发生过滤。
    • 哎呀,现在我看到 andriy 打败了我;)哦,好吧!
    猜你喜欢
    • 2019-11-12
    • 2021-10-13
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多