0

给定两个名为 team 和 Award 的表,我需要根据每个团队的排名为团队分配一个奖项。下面是两张表:

团队

team_id 姓名
1 星星 4
2 蠕虫 2
3 鸟类 1
4 小狗 3
5 5
6 野马 8
7 汽车 11
8 骆驼 7
9 9
10 蝗虫 6
11 公牛 10

临界点 数量
1 10000.00
2 7000.00
3 5000.00
6 2000.00
10 500.00

必须将团队分配给这样的奖项:

临界点 数量
1 1 10000.00
2 2 7000.00
3 3 5000.00
4 6 2000.00
5 6 2000.00
6 6 2000.00
7 10 500.00
8 10 500.00
9 10 500.00
10 10 500.00
11 无效的 无效的

我以前从未使用过非 equi 连接,但我认为这可能是一个经典示例,其中非 equi 连接会有所帮助。我写了这个 MySQL 查询,它给出了我想要的结果:

SELECT t.name, t.rank, MIN(a.threshold) AS threshold, MAX(a.amount) AS amount
FROM team AS t
    INNER JOIN award AS a ON t.rank <= a.threshold
GROUP BY t.team_id
ORDER BY t.rank;
姓名 临界点 数量
鸟类 1 1 10000.00
蠕虫 2 2 7000.00
小狗 3 3 5000.00
星星 4 6 2000.00
5 6 2000.00
蝗虫 6 6 2000.00
骆驼 7 10 500.00
野马 8 10 500.00
9 10 500.00
公牛 10 10 500.00

我的问题是,“使用我不理解的非 equi 连接是否存在问题?” 或者换句话说,“有没有更标准的 SQL 方法来解决这个问题?”

4

1 回答 1

1

LATERAL JOIN也是标准的,但不是每个 RDBMS 中的特性。

SELECT t.team_id, t.name, t.rank
, award.threshold
, award.amount
FROM team t
CROSS JOIN LATERAL (
    select
      min(a.threshold) as threshold
    , max(a.amount) as amount
    from award a
    where a.threshold >= t.rank
) award
ORDER BY t.rank;

它类似于相关的子查询。
但是您可以从中获得更多列。

于 2021-12-02T04:58:53.747 回答