【问题标题】:SQL join same information from two tables using conditionsSQL使用条件连接来自两个表的相同信息
【发布时间】:2019-12-12 09:48:01
【问题描述】:

我有一个主表t,我想将来自另外两个表mn 的出生日期信息加入其中,从而在表t 中创建列birth_date。我加入的关键变量是ID,它出现在所有三个表中。

我遇到的问题是表t 包含变量age,我想加入表m 中的出生日期仅当 t.age < 18 和表n 中的出生日期仅当 t.age >= 18。 我现在拥有的是:

select t.*,
       m.birth_date as birth_date_1,
       n.birth_date as birth_date_2
from t
left join m
on (t.ID = m.ID and t.age < 18)
left join n
on (t.ID = n.ID and t.age >= 18);

这似乎可行,但是,我创建了两列 birth_date_1birth_date_2。如何在这一选择中执行此操作以仅创建一列birth_date

【问题讨论】:

  • “在这一选择中执行此操作以仅创建一列”不清楚。要从中选择的每一行都有某些具有某些值的列。你想从这样的一行中得到什么结果?使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。

标签: sql join plsql left-join


【解决方案1】:

如何在这一选择中执行此操作以仅创建一列birth_date?

由于源表中的每条记录最多有一个左连接成功,因此您可以使用coalesce()

select t.*, coalesce(m.birth_date, n.birth_date) as birth_date
from t
left join m on t.ID = m.ID and t.age < 18
left join n on t.ID = n.ID and t.age >= 18

旁注:连接条件周围的括号是多余的。

【讨论】:

    【解决方案2】:

    你可以

    SELECT
        [...],
        COALESCE(m.birth_date, n.birth_date) AS birth_date,
        [...]
    

    【讨论】:

    • 如果我已经在为m.birth_date 使用合并:coalesce(m.birth_date_final, m.birth_date_orig) as birth_date_1?那么我可以在我想的另一个合并中使用合并吗? COALESCE(coalesce(m.birth_date_final, m.birth_date_orig), n.birth_date) AS birth_date
    • 是的。由于COALESCE 有多个参数,你甚至可以COALESCE(m.birth_date_final, m.birth_date_orig, n.birth_date) AS birth_date
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2017-11-14
    • 2021-12-07
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多