首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果另一个表中的某个列中的任何值包含相同的"string“,则需要添加包含"string”的列

如果另一个表中的某个列中的任何值包含相同的"string“,则需要添加包含"string”的列
EN

Stack Overflow用户
提问于 2019-06-23 21:48:55
回答 2查看 64关注 0票数 0

我正在尝试修改一个查询,以添加一个值必须为"fail“的列,如果另一个表中具有相同id的任何值在某个列中都为"fail”。

有3个表,表1包含4行(类别)的财务数据(固定收益、股票、评级、列表)及其systemId。

表2包含1000多行财务数据,这些数据可能属于这4个类别中的任何一个。表2还具有名为STATUS的行,该行可能包含值:"running“、"fail”或"standby“。

表3包含关于数据集的一般信息,并且具有idsystemId的值。

我想添加一个名为STATE的列到TABLE1(categories),如果具有相同systemId的任何行包含值"fail“或"standby”,则该列包含"fail“或"standy”,并且仅当具有相同systemId (table2)的所有行在其状态列(table2)中具有"running“时才显示"running”。

表1

代码语言:javascript
复制
         category             systemId      ???STATE??? 

         fixed income         1                 ?
         listings             2                 ?
         ratings              3                 ?
         equities             4                 ?

表2

代码语言:javascript
复制
  ID                    STATUS

  45421158              failed 
  2121158              running  
  9464548888             running
  454548888             standby
  9948158              running
  78748158              running

TABLE3

代码语言:javascript
复制
  id                    **systemId**
  45421158              1
  98721158              1
  454548888             2
  6888888             2
  78748158              3
  9978158              3

我尝试了这么多不同的连接和子查询,但都没有成功。我是一个UI开发人员,没有访问数据库,只有通过缓存运行在java上的样本,所以我不能添加新的表或任何类似的东西,它必须是1个查询,所以我可以修改资源。

提前感谢您,您将合法地拯救我的生命!

EN

回答 2

Stack Overflow用户

发布于 2019-06-23 21:53:25

我不太清楚表中的列是什么。但是对于您想要的逻辑,一种方法是使用CASEEXISTS

查询看起来像这样,尽管我不确定相关条件是什么(也就是说,哪些条件与两个表中的行匹配):

代码语言:javascript
复制
select c.*,
       (case when exists (select 1
                          from servicemetric.servicemetric m
                          where m.category = c.category and
                                m.status = 'fail'
             then 'fail'
             when exists (select 1
                          from servicemetric.servicemetric m
                          where m.category = c.category and
                                m.status = 'standby'
             then 'standby'
             else 'running'
        end) as imputed_status
from node.categories c;

您还可以使用条件聚合来实现逻辑:

代码语言:javascript
复制
select m.category,
       (case when sum(case when m.status = 'fail' then 1 else 0 end) > 0 then 'fail'
             when sum(case when m.status = 'standby' then 1 else 0 end) > 0 then 'standby'
             else 'running'
        end) as status
from servicemetric.servicemetric m
group by m.category;

或者甚至使用coalesce()

代码语言:javascript
复制
select m.category,
       coalesce(max(case when m.status = 'fail' then status end),
                max(case when m.status = 'standby' then status end),
                max(m.status)
               )
from servicemetric.servicemetric m
group by m.category;
票数 0
EN

Stack Overflow用户

发布于 2019-06-24 00:30:24

您必须将3个表、group by类别和系统and连接起来:

代码语言:javascript
复制
select
  t1.category,
  t1.systemid,
  case
    when sum(case when t2.status = 'failed' then 1 else 0 end) > 0 then 'failed'
    when sum(case when t2.status = 'standby' then 1 else 0 end) > 0 then 'standby'
    when sum(case when t2.status = 'running' then 1 else 0 end) > 0 then 'running'
  end status
from table1 t1
left join table3 t3 on t3.systemid = t1.systemid
left join table2 t2 on t2.id = t3.id
group by t1.category, t1.systemid

我使用了left连接,以防table3中缺少系统I。如果不是这样,请更改为inner joins

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56724505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档