SQL连接,只返回最大值

时间:2014-03-14 07:49:07

标签: sql database join unique

寻找SQL的一些帮助。我有以下4个表

用户表

+-----------------------------+
| ID | First_Name | Last_Name |
+-----------------------------+
| 1  | Billy      | O'Neal    |
+----+------------+-----------+
| 2  | John       | Skeet     |
+----+------------+-----------+
| 3  | Ken        | Stamp     |
+----+------------+-----------+
| 4  | Doug       | Feng      |
+----+------------+-----------+

Book_CheckOut

+----+--------------+---------------+
| ID | User_ID      | Book_ID       |
+-----------------------------------+
| 1  | 1            | 1             |
+----+--------------+---------------+
| 2  | 2            | 3             |
+----+--------------+---------------+
| 3  | 2            | 1             |
+----+--------------+---------------+
| 4  | 2            | 2             |
+----+--------------+---------------+
| 5  | 3            | 1             |
+----+--------------+---------------+
| 6  | 1            | 4             |
+----+--------------+---------------+
| 7  | 1            | 0             |
+----+--------------+---------------+

图书

+---------+-------------+-------------+
| ID      | Book_Name   | Location_ID |
+-----------------------+-------------+
| 1       | Programming | 1           |
+---------+-------------+-------------+
| 2       | Cooking     | 3           |
+---------+-------------+-------------+
| 3       | Dancing     | 2           |
+---------+-------------+-------------+
| 4       | Sports      | 1           |
+---------+-------------+-------------+

位置

+---------+-------------+
| ID      | Loc_Name    |
+-----------------------+
| 1       | Palo Alto   |
+---------+-------------+
| 2       | San Jose    |
+---------+-------------+
| 3       | Oakland     |
+---------+-------------+
| 4       | Cupertino   |
+---------+-------------+

我想要了解的是找出所有签出最新图书的人。如果该人没有任何记录,他应该出现。如果没有匹配的书籍如0,则表示该人返回了所有书籍。他也应该出现。

结束结果

 Record
+-----------------+----------------+----------------+
| First_Name      | Book_Name      | Loc_Name       |
+-----------------+----------------+----------------+
| Billy           |                |                |
+-----------------+----------------+----------------+
| John            | Cooking        | Oakland        |
+-----------------+----------------+----------------+
| Ken             | Programming    | Palo Alto      |
+-----------------+----------------+----------------+
| Doug            |                |                |
+-----------------+----------------+----------------+

Billy没有任何东西,因为他在Book_CheckOut的最后一次记录是0而且Doug没有任何东西,因为在Book_CheckOut中没有他的记录。

我尝试过使用MAX()和group by进行各种连接,但似乎没有办法满足我想要的所有内容。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

试试这个:

select
  u.first_name,
  b.book_name,
  l.loc_name
from user u 
  left join (select * 
             from book_checkout t0 
             where id = (select 
                           max(id)
                         from book_checkout
                         where user_id = t0.user_id
                        )
            ) bc on bc.user_id = u.id
  left join books b on b.id = bc.book_id
  left join location l on l.id = b.location_id
第一个连接语句中的

子查询用于仅为每个用户选择最后的记录。但是这个查询被认为每个用户一次只能查看一本书。

让我知道它是否有效)

答案 1 :(得分:0)

        SELECT    LC.First_Name
                , ISNULL(B.Book_Name, N'') AS BookName
                , ISNULL(L.Loc_Name, N'') AS Loc_Name
          FROM  Books AS B 
    INNER JOIN  Book_CheckOut AS BC ON B.ID = BC.Book_ID 
    INNER JOIN  Location AS L ON B.ID = L.ID 
   RIGHT OUTER JOIN (SELECT U.First_Name
                      , ISNULL(MAX(BC.ID), 0) AS BCID
                   FROM Users AS U
        LEFT OUTER JOIN Book_CheckOut AS BC ON U.ID = BC.User_ID
               GROUP BY U.First_Name) AS LC ON BC.ID = LC.BCID

子查询显示所有用户的Last CheckOut。

答案 2 :(得分:0)

select First_Name, Book_Name, Location_Name 
from Users U, (select * from Books_Checkout where ID in (select max(ID) from Books_Checkout group by User_ID) and Book_ID is not null order by ID) BC, Books B, Location L 
where U.ID = BC.User_ID and B.ID = BC.Book_ID and L.ID = B.Location_ID;

以上查询结果:

John    Cooking   Oakland
Ken     Programming Palo Alto