如何从由记录标识符连接的 3 个表中检索数据?

0 join query

我有3张桌子。

我需要使用特定WHERE条件检查这些表中是否存在特定标识符。我需要从所有 3 个表中获取数据。

我已经试过LEFT JOINRIGHT JOIN而且FULL OUTER JOIN但我无法得到中间表的值。

我的查询尝试是:

Select t1.col1, t2.col2, t3.col3
from t1
left outer join t2
on t1.id=t2.id
full outer join t3
on t1.id=t3.id
where t.id= '101';
Run Code Online (Sandbox Code Playgroud)

我无法获得仅存在于 t2 表中的值。

And*_*y M 6

我假设 ID 列是 PK 或在所有三个表中声明为唯一的。

现在,如果这些场景中的每一个都同样可能:

  • 所有三个表都有一个 ID 为 101 的行,

  • 三个表中只有两个(任意两个)有 ID 为 101 的行,

  • 三个表中只有一个(任何一个)有 ID 为 101 的行,

并且您希望从每个具有匹配项的表中获取请求的数据 – 那么您只需要使用完整连接。

这是实现请求的一种方式:

SELECT
  t1.Col AS t1Col,
  t2.Col AS t2Col,
  t3.Col AS t3Col
FROM
  t1
  FULL JOIN t2 ON t1.ID = t2.ID
  FULL JOIN t3 ON COALESCE(t1.ID, t2.ID) = t3.ID
WHERE
  COALESCE(t1.ID, t2.ID, t3.ID) = 101
;
Run Code Online (Sandbox Code Playgroud)

如您所见,为了在只有一个匹配时将第三个表的 ID 与其他两个表中的任何一个的 ID 匹配,您可以使用 COALESCE 函数。COALESCE 将选择指定的两个 ID 的非空(非空)ID,从而确保第三个 ID 将与任一表中的现有行匹配。如果两个表中都存在匹配项,则相同的条件将正常工作。

WHERE 条件使用类似的技术来过滤结果集。由于连接集合的每一行中的每个表的 ID 应该是相同的值或空值,因此 COALESCE 函数必须选择一个非空值来与指定的参数 (101) 进行比较。因此,只有具有来自所有三个表或其中任何一个的匹配数据的行才会被选择。

您也可以采用稍微不同的方法:分别ID = 101从每个表中选择与条件匹配的行,将结果用作派生表,然后将它们连接起来:

SELECT
  t1.Col AS t1Col,
  t2.Col AS t2Col,
  t3.Col AS t3Col
FROM
  (
    SELECT ID, Col FROM t1 WHERE ID = 101
  ) AS t1
  FULL JOIN
  (
    SELECT ID, Col FROM t2 WHERE ID = 101
  ) AS t2 ON t1.ID = t2.ID
  FULL JOIN
  (
    SELECT ID, Col FROM t3 WHERE ID = 101
  ) AS t3 ON COALESCE(t1.ID, t2.ID) = t3.ID
;
Run Code Online (Sandbox Code Playgroud)

尽管您现在必须重复相同的过滤条件,但结果查询可能会更高效——这取决于查询优化器在您的数据库系统中的智能程度。

测试这两个查询以确定哪个更适合您。