【问题标题】:SQL One-To-Many join issueSQL 一对多连接问题
【发布时间】:2013-12-12 00:41:58
【问题描述】:

假设我在 Access 中有两个表。表格字母和表格编号。 TableLetters 有一列 TheLetter 和 4 条记录,A、B、C 和 D。对于一个 TableLetters 记录,TheNumbers 是很多的。假设我们在 TheNumbersTable [TheLetter][TheNumber] 中有两列。见下文:

TheLetters
[TheLetter]
A
B
C
D

TheNumbers
[TheLetter][TheNumber]
A          1
A          2
A          3
B          1
B          2

如何编写一个查询,为每个“TheLetters”记录返回一条记录,以及 TheNumbers 表中的 MAX 个“TheNumber”,或者如果 TheNumbers 表中的 TheLetter 没有匹配项,则返回空白?所以我希望我的结果集是:

[TheLetters.TheLetter][TheNumbers.TheNumber]
A                     3  
B                     2  
C                     <NULL>
D                     <NULL>

我可以得到 A,3 - B,2 但它会切断 C 和 D,因为 TheNumbers 中没有匹配项。我试过改变我的加入。我尝试在 WHERE 子句中放置一个 IF,说明如果我们有匹配项,则返回 TheNumbers 的记录,否则给我空白。我似乎无法正确使用语法。感谢您的帮助!

【问题讨论】:

    标签: sql ms-access join max


    【解决方案1】:

    关键是使用LEFT JOIN

    SELECT l.TheLetter, MAX(n.TheNumber)
    FROM TheLetters l
    LEFT JOIN TheNumbers n ON l.TheLetter = n.TheLetter
    GROUP BY l.TheLetter
    

    左外连接返回左表中的所有行,返回右表中任何相关行的数据,如果没有相关,则返回右表列设置为 NULL 的单行行。

    【讨论】:

    • 谢谢,我试试看,应该是“ON l.TheLetter = n.TheLetter”吗?
    • @DontFretBrett 是的,对不起。
    • 好的,谢谢!那行得通。我忘了问一件事——如果“TheNumbers”还有一列,我也想从通过执行 MAX(n.TheNumber) 选择的同一记录中返回该列值怎么办。我尝试做 MAX(n.TheNumber),(SELECT n.NumberString FROM n WHERE n.TheNumber=MAX(n.TheNumber) 和 n.TheLetter = l.TheLetter) AS NumberString。它说我不能在 WHERE 子句中有聚合函数。谢了!
    • 这完全是一个单独的问题,但请查看stackoverflow.com/questions/3680254/…stackoverflow.com/questions/4761517/…
    • 谢谢,我去看看
    【解决方案2】:

    Left Join 应该如下更正

    选择 l.TheLetter, MAX(n.TheNumber) 来自 TheLetters l LEFT JOIN TheNumbers n ON l.TheLetter = n.TheLetter GROUP BY l.TheLetter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多