在有序子查询表上选择DISTINCT

时间:2018-05-06 18:00:06

标签: postgresql psql

我正在处理一个涉及这两个表的问题。

               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

查询"列出所有书名,并表示是否签出了该书的副本。"所以几乎只是带有签出列的第一个表。

我首先尝试使用结帐书籍对子查询进行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;

2 个答案:

答案 0 :(得分:1)

或者您只能加入未签入图书的交易:

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

答案 1 :(得分:0)

我调整了你的尝试。基本上我改变了数据的加入方式

LOCAL