Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取

Posted

技术标签:

【中文标题】Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取【英文标题】:Redshift : Fetch value from table 1 if value exists else pull from table 2 【发布时间】:2019-07-15 08:11:52 【问题描述】:

我正在使用 Redshift DB。

我有一个存储在表customers 中的客户 ID 列表

Query : select name from customers

根据购买数据,我有一张包含客户年龄的表格。表名:sales

Query : select name, age_group from sales

我有另一个表,其中包含所有客户的 age_group,无论他们是否存在于 sales 表中。这个表叫customer_profile

Query : select name, age_group from customer_profile

我正在尝试构建一个查询,以便为customers 中的每个客户创建一个标记为age_group 的列。

条件 : 如果age_group 值存在于sales 中,则需要从sales 中提取,否则需要从customer_profile 表中获取数据

【问题讨论】:

【参考方案1】:

这个怎么样

SELECT
  t1.name,
  isnull(t1.cp_age, t1.s_age) as age_Group
FROM
  (
    SELECT
      c.name,
      c.age_group,
      cp.age_group as cp_age,
      s.age_group as s_age
    FROM
      customers c
      LEFT JOIN customer_profile cp on cp.age_group = c.age_group
      and c.name = cp.name
      LEFT JOIN sales s on s.age_group = c.age_group
      and c.name = s.name
  ) as t1

【讨论】:

@scottmartin 。 . .您的问题在customers 中没有提到名为age_group 的列。接受这个答案令人困惑。 @GordonLinoff,刚刚使用了提到的方法。没有查看实际使用的列。因为这有助于接受答案【参考方案2】:

你可以使用联合

select name, age_group from sales 
where age_group is not null or age_group<>0 
union 
select name, age_group from customer_profile
where age_group is not null or age_group<>0

【讨论】:

如果两个表中都存在相同的名称,则不会联合给出重复项 @scottmartin no union 将返回不同的名称,它将删除重复的 union all make duplicate【参考方案3】:

假设您在 salescustomer_profile 中没有重复项,我建议:

SELECT c.*,
       COALESCE(s.age_group, cp.age_group) as age
FROM customers c LEFT JOIN
     sales s
     ON s.name = c.name LEFT JOIN
     customer_profile cp 
     ON cp.name = c.name AND
        s.name IS NULL;  -- no match in sales

假设您没有重复项,这似乎是最简单的解决方案。

【讨论】:

以上是关于Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取的主要内容,如果未能解决你的问题,请参考以下文章

如果 Redshift 中存在表,则从表中删除行,否则忽略删除

如果存在表 B,则从表 B 中获取数据,否则保留表 A(在某些列之后)

如果存在则从表中选择,否则从oracle中的另一个表中选择

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

如果连接存在,则从连接表返回值

如何检查表单是不是已打开,如果已打开,则从控件中获取值?