【问题标题】:Any cleaner or alternate way to write sql join script编写 sql join 脚本的任何更简洁或替代的方法
【发布时间】:2026-01-25 20:55:01
【问题描述】:

我有以下表格:

 Table2       
 StudentNumbers  ExamType
 ------------------------
           1234         1
           2343         2   
           3345         5
           3454         1
           5465         2
            ...

 Table1   
 StudentNumbers  ExamType   ExamDate  School  Area             Info
 ------------------------------------------------------------------
           1234         1       0825  warren    ny    0x504B03042D0
           1234         1       0829   north    nj    0x63D86E1FFFF
           1233         2       0921   north    nj    0xA001400646F
           2343         1       0922  warren    ny    0x01400646174
           2343         1       0925   north    ny    0x100100070se
            ...

我正在尝试编写查询以获得以下结果:

StudentNumbers  ExamType   ExamDate  School  Area            Info
-----------------------------------------------------------------
          1234         1       0829   north    nj   0x63D86E1FFFF
          2343         1       0925   north    ny   0x100100070se

我写了以下查询:

Select t1.StudentNumbers, t1.ExamDate, t1.School, t1.Info, t1.ExamType        
from Table1 as t1
  Join(
       Select ts.StudentNumbers, max(ts.ExamDate) as ExamDate
       from Table2 as ts
         Join Table1 as pl on 
           ts.StudentNumbers = pl.StudentNumbers where ts.ExamType = pl.ExamType
       group by ts.StudentNumbers
       ) as t2 on t1.StudentNumbers = t2.StudentNumbers
                    and t1.ExamDate = t2.ExamDate

上面的查询有效,并给出了我想要的结果,即基于 Table2 的特定 ExamType 的 max ExamDate。但是在这种聚合方法中使用多个连接是最好的方法吗?或者有没有更清洁的选择。

【问题讨论】:

  • 好吧,我想说这是ANSI SQL 方式,这很好。您可能会根据您的 dbms 找到其他选项,但是...您没有告诉我们您使用的是哪一个。
  • 所以您的问题不是关于联接,而是关于“改进”/更改您的查询?
  • 顺便说一句..您使用的是哪个 DBMS?
  • table2 似乎没有必要,因为 table1 中也提供了相同的信息 (studentNumber/ExampType)(尽管它们在您的示例中并不真正匹配)
  • 您还说您想要“特定 ExamType 的最大考试日期”,但您的 max() 聚合会计算最大值。考试日期每个学生不是每个考试类型。

标签: sql sql-server database sql-server-2008 join


【解决方案1】:

您的查询很好,但我认为在子查询之外使用 Table2 表会更好。

SELECT *
FROM (
      SELECT StudentNumbers, ExamType, MAX(ExamDate) AS ExamDate
      FROM Table1
      GROUP BY StudentNumbers, ExamType
      ) t1 JOIN Table1 t2 ON t1.StudentNumbers = t2.StudentNumbers
             AND t1.ExamType = t2.ExamType AND t1.ExamDate = t2.ExamDate
WHERE EXISTS(
             SELECT 1
             FROM Table2 t3
             WHERE t1.StudentNumbers = t3.StudentNumbers
               AND t1.ExamType = t3.ExamType
             )

【讨论】:

    【解决方案2】:
    SELECT
        t1.*
    FROM Table1 t1
    INNER JOIN Table2 t2
    ON t1.StudentNumbers = t2.StudentNumbers
    WHERE t1.ExamDate = (SELECT MAX(ExamDate) FROM Table1 WHERE StudentNumbers = t1.StudentNumbers)
    ORDER BY t1.StudentNumbers ASC
    

    虽然可能不是最有效的解决方案。

    【讨论】: