sql - 从自然连接中排除列

标签 sql postgresql join natural-join

我目前有以下 PostgreSQL 数据库(图片仅包含基本组件): DBVis image

基本上: 每个 TX 都有一定数量的 TXIN 和一定数量的 TXOUT,每个 TXIN 由一个 TXOUT 环(Monero 交易)组成

如果我将 ring 表与 txin 表连接起来,我使用 select * from ring natural join txin 并且它使用 inid 用于加入。 ringtxout 相同,除了它加入 outid

txintxout 也可以通过自然连接 tx 连接以获得合理的输出。

唯一(预期)不起作用的是:

select * from txout natural join ring natural join txin;

因为它随后加入了 ring(inid) = txin(inid)ring(outid) = txout(outid) (这是需要的)还有 txin(txid) = txout(txid) 这是不需要的。

我有几个解决这个问题的想法:

  1. 使用显式连接(在我看来会使某些查询非常麻烦),例如以上将是:select * from txout join ring using (outid) join txin using (inid);

  2. 重命名 txin 或 txout 中的两个 txid 列之一,并放弃与 tx 的自然连接

  3. 使用省略 txid 的 txin/txout View 进行这些操作

还有其他(更好)的方法吗?如果不是 - 哪种方法是最佳实践? 我的数据库设计是否存在缺陷,整个问题是否可以通过某种方式规避?

最佳答案

自然连接被明确定义为连接所有具有相同名称的列。就是这样,它实际上与(如果此语法有效)JOIN table USING (*) 相同。 冗长的 SQL 没有错。非常清楚您的连接条件会更好,也更易于维护,这意味着如果您将来向这些表添加一列,它不会弄乱历史数据。在这种情况下,我建议使用显式语法加入,因为这可以清楚地表明数据的来源:

SELECT * 
FROM txout to
INNER JOIN ring r ON (to.outid = r.outid)
INNER JOIN txin ti ON (r.inid = ti.inid)

这里要说清楚。自然连接不是一个可维护的解决方案,它们非常适合在紧要关头拼凑一个 View ,但模式会发生变化,如果您使用自然连接而不是显式连接,您将在它们这样做时遇到问题。

我不太确定你为什么要这样设计你的数据库,看起来数据有意重叠并且可以全部放在 (txid, inid, outid, txhash) 的单个表中 但也许我缺乏完整的上下文。

关于sql - 从自然连接中排除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49669249/

相关文章:

sql - 如何按具有空值的列进行分组

Python dict 到用户格式字符串

MySQL 一个查询中的多个联接?

php - Mysql获取两个表的所有连接记录

MySql 在同一查询中更新和选择

sql - 将存储过程输入参数分配给局部变量是否有助于优化查询?

python - 替代 "write to file"使用 COPY 将 CSV 数据传输到 PostgreSQL 以获得更好的性能?

postgresql - 如何使用 Node.js 中的 Lambda 函数从 Amazon RDS 获取数据?

python - 使用 SQLAlchemy 更快地将记录插入表中

SQL 语句将其转换为 1 为 Jan、2 为 Feb 等