SQL加入到最大排拼图

前端之家收集整理的这篇文章主要介绍了SQL加入到最大排拼图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给出以下示例数据:
  1. Users
  2. +--------------------------------------------------+
  3. | ID | First Name | Last Name | Network Identifier |
  4. +--------------------------------------------------+
  5. | 1 | Billy | O'Neal | bro4 |
  6. +----+------------+-----------+--------------------+
  7. | 2 | John | Skeet | jsk1 |
  8. +----+------------+-----------+--------------------+
  9.  
  10. Hardware
  11. +----+-------------------+---------------+
  12. | ID | Hardware Name | Serial Number |
  13. +----------------------------------------+
  14. | 1 | Latitude E6500 | 5555555 |
  15. +----+-------------------+---------------+
  16. | 2 | Latitude E6200 | 2222222 |
  17. +----+-------------------+---------------+
  18.  
  19. HardwareAssignments
  20. +---------+-------------+-------------+
  21. | User ID | Hardware ID | Assigned On |
  22. +-------------------------------------+
  23. | 1 | 1 | April 1 |
  24. +---------+-------------+-------------+
  25. | 1 | 2 | April 10 |
  26. +---------+-------------+-------------+
  27. | 2 | 2 | April 1 |
  28. +---------+-------------+-------------+
  29. | 2 | 1 | April 11 |
  30. +---------+-------------+-------------+

我想编写一个SQL查询,这将产生以下结果:

  1. +--------------------+------------+-----------+----------------+---------------+-------------+
  2. | Network Identifier | First Name | Last Name | Hardware Name | Serial Number | Assigned On |
  3. +--------------------------------------------------------------------------------------------+
  4. | bro4 | Billy | O'Neal | Latitude E6200 | 2222222 | April 10 |
  5. +--------------------+------------+-----------+----------------+---------------+-------------+
  6. | jsk1 | John | Skeet | Latitude E6500 | 5555555 | April 11 |
  7. +--------------------+------------+-----------+----------------+---------------+-------------+

我的麻烦是,每个用户需要为每个用户选择最大的“分配开”日期,并用于实际连接…

有没有一个聪明的方式在sql中完成这个?

解决方法

  1. SELECT U.NetworkIdentifier,U.FirstName,U.LastName,H.HardwareName,H.SerialNumber
  2. FROM (SELECT UserID,MAX(AssignedOn) LastAssignment
  3. FROM HardwareAssignments
  4. GROUP BY UserID) AS T
  5. JOIN HardwareAssignments AS HA
  6. ON HA.UserId = T.UserID AND HA.AssignedOn = T.LastAssignment
  7. JOIN Users AS U ON U.ID = HA.UserID
  8. JOIN Hardware AS H ON H.ID = HA.HardwareID
  9. ORDER BY U.NetworkIdentifier;

这与Justin Niessner的答案之间的区别在于子查询出现在哪里在这里,我已经在FROM子句中创建了它.这几乎保证它被执行一次.当在Justin答案中的WHERE子句中有一个相关的子查询时,优化器可能会为每一行执行一次子查询 – 这在表很大的时候更昂贵.一个非常好的优化器可能会使事情变得平坦,以便两者相当.

猜你在找的MsSQL相关文章