Не показывать повторяющиеся результаты в SQL-запросе с использованием ВНУТРЕННЕГО СОЕДИНЕНИЯ

#java #sql #sql-server #spring-boot

#java #sql #sql-сервер #spring-boot

Вопрос:

Это мой текущий запрос:

 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
  

Я выполняю СОЕДИНЕНИЕ с двумя таблицами, но мне не нужно показывать повторяющиеся данные с помощью e.Идентификатор в качестве столбца для фильтрации дубликатов.

Кроме того, он должен быть отсортирован по столбцу j.application_date, чтобы иметь возможность получать самые последние

ОБНОВЛЕНИЕ 1

Я использовал DISTINCT тег позади SELECT , но он не работает, потому что строки не совсем одинаковые, вот почему он не работает.

Я не знаю, как заставить его давать мне уникальные строки с учетом одного столбца (e.Id или j.EmployeeID)

ОБНОВЛЕНИЕ 2

Если у меня есть эти 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
  

Мне нужно показать для employee = 1 только строку, в которой application_date = 2019-08-27, и отбросить другую (application_date = 2018-05-14)

Ответ №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
  

Комментарии:

1. Я использовал тег «DISTINCT» за SELECT, но он не работает, потому что строки не совсем одинаковые, поэтому он не работает

2. Я не знаю, как заставить его давать мне уникальные строки с учетом одного столбца (e.Id или j.EmployeeID)

3. можете ли вы добавить некоторые из ваших данных и желаемый результат?

Ответ №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