簡體   English   中英

不要使用 INNER JOIN 在 SQL 查詢中顯示重復結果

[英]Don't show repeated results in SQL query using INNER JOIN

這是我當前的查詢:

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

工作申請表

 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

我只需要為 employee = 1 顯示 application_date = 2019-08-27 的行,並丟棄另一個 (application_date = 2018-05-14)

使用這個:

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

您可以使用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的版本允許您返回更多列。 而且,這個版本還會返回所有員工,而不僅僅是那些匹配的員工。

使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM