SELECT DISTINCT 在有序子查询的 table

SELECT DISTINCT on a ordered subquery's table

我正在解决一个问题,涉及这两个 table。

               books
isbn    |                  title                  |      author      
------------+-----------------------------------------+------------------
1840918626 | Hogwarts: A History                     | Bathilda Bagshot
3458400871 | Fantastic Beasts and Where to Find Them | Newt Scamander
9136884926 | Advanced Potion-Making                  | Libatius Borage


              transactions
id | patron_id |    isbn    | checked_out_date | checked_in_date 
----+-----------+------------+------------------+-----------------
1 |         1 | 1840918626 | 2012-05-05       | 2012-05-06
2 |         4 | 9136884926 | 2012-05-05       | 2012-05-06
3 |         2 | 3458400871 | 2012-05-05       | 2012-05-06
4 |         3 | 3458400871 | 2018-04-29       | 2018-05-02
5 |         2 | 9136884926 | 2018-05-03       | NULL
6 |         1 | 3458400871 | 2018-05-03       | 2018-05-05
7 |         5 | 3458400871 | 2018-05-05       | NULL

查询 "Make a list of all book titles and denote whether or not a copy of that book is checked out." 几乎只是第一个 table 带有签出列。

我试图 SELECT DISTINCT 子查询首先使用结帐书籍,但这不起作用。我研究过,其他人说要完成此操作,请使用 GROUP BY 子句而不是 DISTINCT,但他们提供的示例是一列查询,当添加更多列时,它不起作用。

这是我最接近的尝试

SELECT DISTINCT ON (title)
title, checked_out
FROM(
  SELECT b.title, t.checked_in_date IS NULL AS checked_out
  FROM transactions t
  natural join books b
  ORDER BY checked_out DESC
) t;

我稍微调整了你的尝试。基本上我改变了你的数据连接方式

SELECT DISTINCT ON (title)
title, checked_out
FROM(
  SELECT b.title, t.checked_in_date IS NULL AS checked_out
  FROM books b
  LEFT OUTER JOIN transactions t USING (isbn)
  ORDER BY checked_out DESC
) t;

或者您可以仅加入未签入图书的交易:

SELECT b.title, t.isbn IS NOT NULL AS checked_out
, t.checked_out_date
FROM books b
LEFT JOIN transactions t ON t.isbn = b.isbn AND t.checked_in_date IS NULL
ORDER BY checked_out DESC