【问题标题】:Don't show repeated results in SQL query using INNER JOIN不要在使用 INNER JOIN 的 SQL 查询中显示重复的结果
【发布时间】:2021-01-08 10:33:20
【问题描述】:

这是我当前的查询:

SELECT e.*, j.application_date
FROM employee e JOIN job_application j ON e.Id=j.employeeId
WHERE j.status IN ('test1', 'test2')
ORDER BY j.application_date DESC

我正在对两个表进行 JOIN,但我不需要使用 e.Id 作为列来显示重复数据以过滤重复项。

此外,它必须按列 j.application_date 排序才能接收最新的

更新 1

我使用了SELECT后面的DISTINCT标签,但是由于行不完全相同,所以它不起作用。

考虑到单列(e.Id 或 j.employeeId),我不知道如何让它给我唯一的行

更新 2

如果我有这两张桌子:

员工表

 Id        |  FirstName   | LastName      |  YearOfBirth
--------------------------------------------------------
  0        |  Thomas      | Smith         |   1977
  1        |  Peter       | Edison        |   1969
  2        |  Albon       | Boeraner      |   1995
  3        |  Mary        | Caters        |   1982

job_application 表

 Id        |  employeeId  | application_date  | address    | status
---------------------------------------------------------------------
  0        |  1           |   2018-05-14      | address 1  | test1
  1        |  1           |   2018-02-19      | address 2  | test3
  2        |  1           |   2019-08-27      | address 3  | test2
  3        |  3           |   2019-11-16      | address 4  | test1

我需要为员工 = 1 只显示 application_date = 2019-08-27 的行,并丢弃另一行 (application_date = 2018-05-14)

【问题讨论】:

    标签: java sql sql-server spring-boot


    【解决方案1】:

    使用这个:

    select e2.* , T2.Mapplication_date
    from (select e.Id, max(j.application_date ) as Mapplication_date 
      FROM employee e JOIN job_application j ON e.Id=j.employeeId
        group by e.Id ) as T2
    JOIN employee e2 ON e2.Id= T2.Id
    

    【讨论】:

    • 我在SELECT后面使用了“DISTINCT”标签,但是由于行不完全相同,所以它不起作用,这就是它不起作用的原因
    • 考虑到单列(e.Id 或 j.employeeId),我不知道如何让它给我唯一的行
    • 你能添加一些你的数据和你想要的输出吗?
    【解决方案2】:

    你可以使用apply:

    SELECT e.*, j.application_date
    FROM employee e CROSS APPLY
         (SELECT TOP (1) j.*
          FROM job_application j 
          WHERE j.employeeId = e.id AND
                j.status IN ('test1', 'test2')
          ORDER BY j.application_date DESC
         ) j;
    

    您只查找一列,因此相关子查询也可以工作:

    SELECT e.*, 
           (SELECT TOP (1) j.application_date
            FROM job_application j 
            WHERE j.employeeId = e.id AND
                  j.status IN ('test1', 'test2')
            ORDER BY j.application_date DESC
           ) as application_date
    FROM employee e;
    

    使用apply 的版本允许您根据需要返回更多列。而且,此版本还返回所有员工,而不仅仅是匹配的员工。

    【讨论】:

      【解决方案3】:

      使用 CTE 使用 row_number 按日期对员工的每个申请进行编号。所以你可以只加入最后一个申请(编号 = 1)

      with last_application as (
        select employeeId,  application_date,
               row_number() over (partition by employeeId order by application_date desc) as num
        from job_application
        where status IN ('test1', 'test2')
      )
      select e.*, j.application_date
      from employee
           inner join last_application j on j.employee_id = e.Id and j.num = 1
      

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 2016-08-29
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        相关资源
        最近更新 更多