sql - 用其他表中的值替换选择值
问题描述
我正在尝试查询一个表,我想用相关表具有 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;
推荐阅读
- excel - 使用工作簿文件名作为工作表名
- python - 错误:“activate 不接受多个参数:”(使用 condo 激活 env 时)
- batch-file - 可以仅对具有特定签名的文件夹进行 robocopy 吗?
- ionic-framework - 如何使用 ionic 导入 whatsapp 贴纸
- google-calendar-api - 如何更改谷歌日历邀请的显示名称?
- angular - 如何使用表单控件
内联格式? - php - 如何以 GET 格式显示页码?在代码点火器中
- javascript - 如何在 md-switch 的两侧放置文本?
- java - 无法使用 apache camel 读取条形码
- python - 无法在 PYcharm-Conda、MacOS Catalina 上安装“TWINT”