Sql 将选择值替换为其他表中的值

Sql 将选择值替换为其他表中的值,sql,postgresql,select,Sql,Postgresql,Select,我试图查询一个表,我想用一个相关表具有fk约束的值替换它的外键。我不知道如何用语言更好地解释它——我举了一个简单的例子来说明我的困难 创建表客户( cpr VARCHAR(10)主键, 名称VARCHAR(100)不为空 ); 创建表帐户( id串行主键, 余额INT默认为0, customerCpr VARCHAR(10)引用的客户(cpr)不为空, ); 创建表事务( id串行主键, 检索器INT引用的帐户(id)不为NULL, 给定者整数引用帐户(id)不为空, 时间戳时间戳默认当前时间戳

我试图查询一个表,我想用一个相关表具有fk约束的值替换它的外键。我不知道如何用语言更好地解释它——我举了一个简单的例子来说明我的困难

创建表客户(
cpr VARCHAR(10)主键,
名称VARCHAR(100)不为空
);
创建表帐户(
id串行主键,
余额INT默认为0,
customerCpr VARCHAR(10)引用的客户(cpr)不为空,
);
创建表事务(
id串行主键,
检索器INT引用的帐户(id)不为NULL,
给定者整数引用帐户(id)不为空,
时间戳时间戳默认当前时间戳,
金额INT不为空
);
所以我想问一些类似的问题

选择retrieverCustomer.name、giverCustomer.name、tran.timestamp tran.amount
从事务传输
其中tran.retriever=20或tran.giver=20。。。
我希望它返回以下格式:

 id | retName   | gName |         timestamp          | amount 
----+-----------+-------+----------------------------+--------
  1 | Elisabeth | Jonas | 2020-05-09 11:07:50.614155 |   1500
  2 |  Veronica | Peter | 2020-05-09 11:07:50.614155 |   2200
  3 |Kristoffer | Jens  | 2020-05-09 11:07:50.614155 |   1700

我不知道如何做到这一点,我尝试了一些加入和一些条件,但我没有看到这个问题通过。如果有人知道如何做到这一点,或者可以解释为什么这样做并不理想,这将真正帮助我。

你想加入acounts and customers表twices,一次作为给予者,一次作为检索者:

SELECT cr.name as retriever_customer, cg.name as giver_customer, t.timestamp, t.amount 
FROM transactions t
JOIN accounts ar on ar.id = t.retriever
JOIN accounts ag on ag.id = t.giver
JOIN customers cr on cr.cpr = ar.customercpr
JOIN customers cg on cg.cpr = ag.customercpr
WHERE t.retriever = 20 OR t.giver = 20
ORDER BY t.timestamp;

这是一个CTE可以证明更清晰的地方:

with ac as (  -- accounts with the customer name added on
      select a.*, c.name
      from accounts a join
           customers c
           on a.customercpr = c.cpr
     )
select t.id, acg.name as giver_name, acr.name as retriever_name, t.timestamp, t.amount
from transactions t join
     ac acg
     on acg.id = t.giver join
     ac acr
     on acr.id = t.retriever 
where 20 in (t.giver, t.retriever);