mysql - 使用 UNION 的最佳方式是什么?
问题描述
我有两个选择语句in joined
。union
sql
如果任一 select 语句返回一条记录,则它必须显示在结果中。
但如果这两个语句都返回记录,我只希望结果中显示 1 个结果。
请建议最好的方法来做到这一点
解决方案
您想对结果进行排名。假设您有一张今年的销售额表和一张去年的销售额表。表的主键是卖方。现在您想为每个卖家显示一行,最好是今年的销售额,只有在没有可用时,您才会显示他们去年的销售额。
和
select seller, sales from thisyear
union all
select seller, sales from lastyear;
你会得到两年,你甚至不会看到什么是什么。
和
select seller, 'this year' as year, sales from thisyear
union all
select seller, 'last year' as year, sales from lastyear;
您会看到年份,但对于两者都有销售的卖家来说,仍然可以得到这两年。有些卖家只在今年排,有些只在去年排,但有些卖家两年都排,这是你不想要的。
因此,您想要获取此结果,但只显示每个卖家的更好行。在标准 SQL 中,您将使用ROW_NUMBER
. 这在 MySQL 8.0 版本中可用。(在旧版本中,您可以以某种方式使用变量来模拟它。您会在 StackOverflow 上找到很多这样的示例。)
select seller, year, sales
from
(
select
seller, year, sales,
row_number() over (partition by seller order by year = 'this year' desc) as rn
from
(
select seller, 'this year' as year, sales from thisyear
union all
select seller, 'last year' as year, sales from lastyear;
) data
) ranked
where rn = 1
order by seller;
该表达式order by year = 'this year' desc
使用 MySQL 的 true = 1, false = 0。
推荐阅读
- javascript - 循环遍历对象数组时出现未定义的错误
- html - 为什么当我添加 div::before 时第一个字母不起作用?
- amazon-web-services - 使用 ALB 进行身份验证
- graphql - nestjs / graphql:默认异常过滤器泄露了太多敏感数据
- python - Python - 是否可以在列表中临时保留一个列表,并在需要时返回它?
- c# - blazor如何实时读取webapi并显示?
- python - 如何从循环的每个实例中收集信息?
- snowflake-cloud-data-platform - 雪花模式中可以包含哪些对象?
- r - 嵌套在另一个变量中的子集行
- android - 为什么我的 BottomNavigationView 的项目标签在选择时会短暂消失?