首页 > 解决方案 > 使用子查询加入表

问题描述

我有一个起始表,它来自一个查询:

CREATE TABLE my_base 
(
    the_id varchar(6) NOT NULL, 
    the_pay int NOT NULL, 
    the_name varchar(10) NOT NULL
)

INSERT INTO my_base
VALUES ('LMUS01', '2000', 'JOE'), 
       ('LMUS02', '1500', 'JACK')

还有一个债务数据“my_table”:

CREATE TABLE my_table 
(
    the_debt_id varchar(6) NOT NULL, 
    the_debt_amount int NOT NULL, 
    the_debt_date date NOT NULL
)

INSERT INTO my_table
VALUES ('LMUS01', '180', '2/12/2019'), 
       ('LMUS01', '200', '2/11/2019'), 
       ('LMUS01', '300', '2/13/2019'), 
       ('LMUS02', '100', '2/10/2019'), 
       ('LMUS02', '150', '2/12/2019')

而我想要的查询是“my_base”中的所有记录加入到“my_table”中变量“the_debt_date”的最小值:

'LMUS01','2000','JOE','200','2/11/2019'
'LMUS02','1500','JACK','100','2/10/2019' 

当我在“my_table”中一一进行时,我使用以下查询:

SELECT the_debt_amount, the_debt_date FROM my_table 
WHERE the_debt_id = 'LMUS01' 
AND the_debt_date = (select min(the_debt_date) 
FROM my_table WHERE the_debt_id = 'LMUS01')

但我想要“my_base”中的所有记录。我试过了:

SELECT * FROM my_base 
LEFT JOIN my_table ON the_debt_id = the_id WHERE the_id = the_debt_id 
AND the_debt_date = (select min(the_debt_date) FROM my_table WHERE the_id = the_debt_id)

但它发送一个错误。任何帮助将不胜感激。

标签: sqlpostgresql

解决方案


使用distinct on

SELECT DISTINCT ON (b.the_id) b.*, t.*
FROM my_base b LEFT JOIN
     my_table t
     ON t.the_debt_id = b.the_id 
ORDER BY b.the_id, t.the_debt_date asc;

WHERE子句撤消外连接。但无论如何都不需要它。


推荐阅读