首页 > 解决方案 > 使用 UNION 的最佳方式是什么?

问题描述

我有两个选择语句in joinedunionsql

如果任一 select 语句返回一条记录,则它必须显示在结果中。

但如果这两个语句都返回记录,我只希望结果中显示 1 个结果。

请建议最好的方法来做到这一点

标签: mysqlsql

解决方案


您想对结果进行排名。假设您有一张今年的销售额表和一张去年的销售额表。表的主键是卖方。现在您想为每个卖家显示一行,最好是今年的销售额,只有在没有可用时,您才会显示他们去年的销售额。

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。


推荐阅读