如何在 SQL 中获取租赁用户而不显示已归还的内容

How do I get rental users in SQL without displaying what has already been returned

我有一个 3 表数据库。这是一个DVD租赁数据库。

我想知道目前租给用户的DVD有哪些。我用 PL/SQL.

我无法解决的是不让返回的 DVD 出现,尤其是当同一个用户再次取出同一张 DVD 时。

  User Table:      DVD Table:                            Rent table:
| ID | Name  |   | ID | Name  |   | ID | USER_ID | DVD_ID | RENT_RETURN | Rent_RETURN_DATE | 
| -- | ----- |   | -- | ----- |   | -- | ------- | ------ | ----------- | ---------------- |
| 1  | USER1 |   | 1  | DVD1  |   | 1  |    1    |    1   |      -1     |     2020.01.01   |   
| 2  | USER2 |   | 2  | DVD2  |   | 2  |    1    |    1   |       1     |     2020.02.01   |
| 3  | USER3 |   | 3  | DVD3  |   | 3  |    1    |    1   |      -1     |     2020.03.01   | 
| 4  | USER4 |   | 4  | DVD4  |   | 4  |    1    |    2   |      -1     |     2020.04.01   | 
                                  | 5  |    2    |    3   |      -1     |     2020.05.01   | 
                                  | 6  |    3    |    4   |      -1     |     2020.06.01   | 
                                  | 7  |    3    |    2   |      -1     |     2020.07.01   | 
                                  | 8  |    3    |    4   |       1     |     2020.08.01   | 

我想达到的目标:

| USER_NAME | DVD_NAME |  RENT_DATE |
| --------- | -------- | ---------- |
|     1     |    1     | 2020.03.01 | 
|     1     |    2     | 2020.04.01 | 
|     2     |    3     | 2020.05.01 | 
|     3     |    2     | 2020.07.01 | 

我试过了,但这还不够:

SELECT U.NAME, D.NAME, R.RENT_RETURN_DATE
FROM USER U, DVD D, RENT R
WHERE U.ID = R.USER_ID
AND D.ID = R.DVD_ID
AND R.RENT_RETURN = 1;

在此先感谢您的帮助!

一种选择是使用 ROW_NUMBER() 分析函数,例如

SELECT user_name, dvd_name, rent_return_date 
  FROM (SELECT ROW_NUMBER() OVER 
                           (PARTITION BY user_id, dvd_id 
                                ORDER BY rent_return_date DESC) AS rn,
               u.name AS user_name, d.name AS dvd_name, r.*
          FROM rent r
          JOIN "user" u
            ON r.user_id = u.id
          JOIN dvd d
            ON r.dvd_id = d.id
         WHERE rent_return = -1)
 WHERE rn = 1  

或者直接使用聚合

SELECT u.name AS user_name,
       d.name AS dvd_name,
       MAX(rent_return_date) AS rent_return_date
  FROM rent r
  JOIN "user" u
    ON r.user_id = u.id
  JOIN dvd d
    ON r.dvd_id = d.id
 WHERE rent_return = -1
 GROUP BY u.name,d.name

SELECT user_name, dvd_name, rent_return_date 从 (SELECT ROW_NUMBER() OVER (分区 user_id,dvd_id ORDER BY rent_return_date DESC) AS rn, u.name AS user_name, d.name AS dvd_name, r.* FROM 租金 加入“用户”你 ON r.user_id = u.id 加入 DVD ON r.dvd_id = d.id 其中 rent_return = -1) 其中 rn = 1