Union vs Case 或其他替代方案

如何解决Union vs Case 或其他替代方案

我有 2 个表,加入后可以告诉我与特定产品相关联的组织。每个组织都有一个状态,“Active”或“Legacy”。我试图只返回“活跃”组织,除非没有“活跃”组织,然后我想要“传统”组织。我不知道如何在没有联合的情况下解决这个问题,我不想使用联合,因为我的一些查询很长而且很复杂。

我目前的方法是两个子查询:一个用于活动,一个用于遗留,然后在 Excel 中手动组合它们。这是低效和烦人的。我希望 CASE 语句可能会消除 UNION,但到目前为止我没有运气。这是问题的简化图:

组织表

|ORG_NAME      |ORG_STATUS|PRODUCT_ID|
|--------------|----------|----------|
|Organization 1|Active    |1         |
|Organization 2|Legacy    |1         |
|Organization 3|Legacy    |2         |
|Organization 4|Active    |3         |

产品表

|ID|PRODUCT_NAME|
|--|------------|
|1 |Product 1   |
|2 |Product 2   |
|3 |Product 3   |

所需的输出:(我确实通过 UNION 得到了它,但我希望有一个不那么麻烦的解决方案。)

|PRODUCT_NAME|ORG_NAME      |ORG_STATUS|
|------------|--------------|----------|
|Product 1   |Organization 1|Active    |
|Product 2   |Organization 3|Legacy    |
|Product 3   |Organization 4|Active    |

如果我使用除 UNION 以外的任何东西,我会得到以下作为我的输出,但是当还有一个活动组织时,我不想要旧组织。

|PRODUCT_NAME|ORG_NAME      |ORG_STATUS|
|------------|--------------|----------|
|Product 1   |Organization 1|Active    |
|Product 1   |Organization 2|Legacy    |
|Product 2   |Organization 3|Legacy    |
|Product 3   |Organization 4|Active    |

我觉得应该有一种简单的方法来根据指定的标准选择填充哪个组织,但我无法找出正确的标准来使其工作。任何帮助将非常感激!提前致谢!

这是简化的联合查询:

    SELECT PROD.PRODUCT_NAME,ORG.ORG_NAME
      FROM products prod,organizations org
     WHERE PROD.ID = ORG.PRODUCT_ID AND ORG.STATUS = 'Active'
    UNION
    SELECT PROD.PRODUCT_NAME,organizations org
     WHERE PROD.ID = ORG.PRODUCT_ID AND ORG.STATUS = 'Legacy'
           AND ORG.PRODUCT_ID NOT IN (SELECT PROD.ID
                                        FROM products prod,organizations org
                                       WHERE ORG.STATUS = 'Active')

我在 select 和 where 语句中都尝试了 CASE,但无法让它工作。下面是其中一种尝试,但这并没有考虑组织和产品之间的连接,只是给了我所有的组合。我尝试连接 org 和 product 来给我一个单一的变量来处理,但这也没有帮助。也许做不到?

WHEN ORG.STATUS = 'Active' THEN ORG.ORG_NAME
ELSE ORG.ORG_NAME
END

解决方法

您可以使用分析函数 row_number 来确定“最佳”行,然后仅选择该行。

select *
  from (
select o.org_name,o.org_status,p.product_id,p.product_name,row_number() over (partition by p.product_id 
                              order by case when o.org_status = 'Active'
                                            then 1
                                            else 2
                                        end asc) rn
  from products p
       join organizations o 
         on p.product_id = o.product_id
) 
 where rn = 1;

这是一个example from liveSQL

,

你应该能够做这样的事情:

SELECT PROD.PRODUCT_NAME,ORG.ORG_NAME,MIN(ORG.STATUS) as OrgStatus
FROM   products prod,organizations org
WHERE  PROD.ID = ORG.PRODUCT_ID
GROUP BY PROD.PRODUCT_NAME,ORG.ORG_NAME

这当然依赖于 Active 在 Legacy 之前排序的事实...... 这还假设产品和组织之间存在 1:1 关系。

,

这是横向连接的一个很好的用例:

select p.*,o.org_name,o.order_status
from products p left join lateral
     (select o.*
      from organizations o
      where o.product_name = p.product_name
      order by o.order_status   -- "Active" before "Legacy"
      fetch first 1 row only
     ) o
     on 1=1;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res