可以使用 JOINS 组合两个表而不会丢失所有数据

Posted

技术标签:

【中文标题】可以使用 JOINS 组合两个表而不会丢失所有数据【英文标题】:Possible to combine two tables without losing all data by using JOINS 【发布时间】:2012-01-08 04:22:33 【问题描述】:

我有一个如下表,我想知道我是否仍然可以将它们连接在一起,而在通过引用 JOIN 方法组合它们时不会丢失两个表中的现有数据。

表格详情 - 查看表格

SELECT
  r.domainid,
  r.DomainStart,
  r.Domain_End,
  r.ddid,
  r.confid,
  r.pdbcode,
  r.chainid,
  d.pdbcode AS "CATH_PDBCODE",
  d.cathbegin AS "CATH_BEGIN",
  d.cathend AS "CATH_END"
FROM dyndom_domain_table r
  JOIN cath_domains d ON d.pdbcode::character(4) = r.pdbcode 
  ORDER BY confid ASC;

如您所见,dyndom_domain_table 是我创建的一个 VIEW 表,以便我可以更轻松地将 JOIN 子句与具有相同 pdbcode 的另一个表一起使用。

到目前为止,它只返回与 PDB 代码匹配的所有数据。我想做的是返回所有匹配和不匹配彼此的 PDB 代码的数据。

是否有可以应用的规则?还是不可能?

【问题讨论】:

【参考方案1】:

我相信您想要一个 FULL OUTER JOIN 而不仅仅是一个 JOIN(默认情况下是一个 INNER JOIN)。在 FULL OUTER JOIN 中,每个表中的每一行都将对应于结果表中的某行;一个表中与另一个表不匹配的行将用 NULL 扩展以填充缺失的列。

所以 FULL OUTER JOIN 而不是仅仅 JOIN,你应该这样做。

【讨论】:

非常感谢您的解释。它确实奏效了。返回所有行,即使它们匹配和不匹配。【参考方案2】:

我认为您要求左连接,但我不确定。

SELECT
  r.domainid,
  r.DomainStart,
  r.Domain_End,
  r.ddid,
  r.confid,
  r.pdbcode,
  r.chainid,
  d.pdbcode AS "CATH_PDBCODE",
  d.cathbegin AS "CATH_BEGIN",
  d.cathend AS "CATH_END"
FROM dyndom_domain_table r
  LEFT JOIN cath_domains d ON d.pdbcode::character(4) = r.pdbcode 
  ORDER BY confid ASC;

【讨论】:

取决于,我猜。如果与第一个表中的任何数据都不匹配,LEFT JOIN 将删除第二个表中的数据。 好吧,我想我们在一件事上达成了一致。他似乎是指外部连接。 :)

以上是关于可以使用 JOINS 组合两个表而不会丢失所有数据的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以打印 rmarkdown 表而不丢失颜色?

QComboBox 文本颜色不会随样式表而改变

从 Qt4 移植到 Qt5 时 Ctrl+U 组合键丢失

在 MySQL 中,如何编写 SQL 来连接两个表而不是一个子查询?

虚拟机上安装linux 分区时硬盘数据会不会丢失

如何参数化 SQL 表而不会受到 SQL 注入的影响