SQL Присоединиться только к максимальной строке головоломки - PullRequest
9 голосов
/ 08 апреля 2010

Учитывая следующие данные примера:

  Users
+--------------------------------------------------+
| ID | First Name | Last Name | Network Identifier |
+--------------------------------------------------+
| 1  | Billy      | O'Neal    | bro4               |
+----+------------+-----------+--------------------+
| 2  | John       | Skeet     | jsk1               |
+----+------------+-----------+--------------------+

 Hardware
+----+-------------------+---------------+
| ID | Hardware Name     | Serial Number |
+----------------------------------------+
| 1  | Latitude E6500    | 5555555       |
+----+-------------------+---------------+
| 2  | Latitude E6200    | 2222222       |
+----+-------------------+---------------+

 HardwareAssignments
+---------+-------------+-------------+
| User ID | Hardware ID | Assigned On |
+-------------------------------------+
| 1       | 1           | April 1     |
+---------+-------------+-------------+
| 1       | 2           | April 10    |
+---------+-------------+-------------+
| 2       | 2           | April 1     |
+---------+-------------+-------------+
| 2       | 1           | April 11    |
+---------+-------------+-------------+

Я хотел бы написать запрос SQL, который бы дал следующий результат:

+--------------------+------------+-----------+----------------+---------------+-------------+
| Network Identifier | First Name | Last Name | Hardware Name  | Serial Number | Assigned On |
+--------------------------------------------------------------------------------------------+
| bro4               | Billy      | O'Neal    | Latitude E6200 | 2222222       | April 10    |
+--------------------+------------+-----------+----------------+---------------+-------------+
| jsk1               | John       | Skeet     | Latitude E6500 | 5555555       | April 11    |
+--------------------+------------+-----------+----------------+---------------+-------------+

Моя проблема в том, что максимальная дата «Назначено» для каждого пользователя должна быть выбрана для каждого отдельного пользователя и использована для фактического объединения ...

Есть ли умный способ сделать это в SQL?

Ответы [ 3 ]

9 голосов
/ 08 апреля 2010
SELECT U.NetworkIdentifier, U.FirstName, U.LastName,
       H.HardwareName, H.SerialNumber
  FROM (SELECT UserID, MAX(AssignedOn) LastAssignment
          FROM HardwareAssignments
         GROUP BY UserID) AS T
  JOIN HardwareAssignments AS HA
       ON HA.UserId = T.UserID AND HA.AssignedOn = T.LastAssignment
  JOIN Users AS U ON U.ID = HA.UserID
  JOIN Hardware AS H ON H.ID = HA.HardwareID
 ORDER BY U.NetworkIdentifier;

Разница между этим и ответом Джастина Несснера в том, где появляется подзапрос; здесь я создал его в предложении FROM. Это в значительной степени гарантирует, что он выполняется один раз. Когда в предложении WHERE есть коррелированный подзапрос, как и в ответе Джастина, возможно, оптимизатор выполнит подзапрос один раз для каждой строки - что дороже, когда таблицы большие. Действительно хороший оптимизатор может сгладить вещи так, чтобы они были эквивалентны.

8 голосов
/ 08 апреля 2010
select * from Users as u
inner join HardwareAssignments as ha
    on u.id = ha.userid
inner join Hardware as h
    on uh.hardwareid = h.id
where ha.AssignedOn = (select max(assignedon)
                       from HardwareAssignments as ha2
                       where ha.userid = ha2.userid)

Это может приблизить тебя. Не уверен, если это точно.

0 голосов
/ 08 апреля 2010

Используйте group by и max для фильтрации результатов объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...