繁体   English   中英

将 select 值替换为其他表中的值

[英]Replacing select values with values from other tables

我正在尝试查询一个表,我想用相关表具有 fk 约束的值替换它的外键。 我不知道如何用语言更好地解释它 - 我做了一个最小的例子来证明我的困难。

    create table customers (
        cpr VARCHAR(10) PRIMARY KEY,
        name VARCHAR(100) NOT NULL
    );

    CREATE TABLE accounts (
        id SERIAL PRIMARY KEY,
        balance INT DEFAULT 0,
        customerCpr VARCHAR(10) references customers (cpr) NOT NULL,
    );

    CREATE TABLE transactions(
        id SERIAL PRIMARY KEY,
        retriever INT references accounts (id) NOT NULL,
        giver     INT references accounts (id) NOT NULL,
        timestamp timestamp default current_timestamp,
        amount    INT NOT NULL
    );

所以我想查询类似

SELECT retrieverCustomer.name, giverCustomer.name, tran.timestamp tran.amount 
FROM transactions tran 
WHERE tran.retriever = 20 OR 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 和 customers 表两次,一次作为给予者,一次作为检索者:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM