在子集上加入左

问题描述 投票:0回答:1

我通过两个不同的查询获得了两个不同的表,如下所示:

第一表

SELECT machine, item, kit FROM table1

机器 项目 套件
100 FV123 Z_00001_01
101 KN456 Z_00008_10
... ... ...

第二个表

SELECT req, kit, comp FROM table2

请求 套件 比较
1 Z_00001_01 N-11111_01
1 Z_00001_01 N-22222_01
1 Z_00001_01 N-33333_01
5 Z_00001_01 N-11111_01
5 Z_00001_01 N-22222_01
2 Z_00008_10 P-11111_01
2 Z_00008_10 P-22222_01
2 Z_00008_10 P-33333_01
4 Z_00008_10 P-11111_01
4 Z_00008_10 P-22222_01
... ... ...

不幸的是,我正在努力实现以下目标:

  1. 按 DESC 顺序按 REQ 列对第二个表进行排序;

    请求 套件 比较
    5 Z_00001_01 N-11111_01
    5 Z_00001_01 N-22222_01
    1 Z_00001_01 N-11111_01
    1 Z_00001_01 N-22222_01
    1 Z_00001_01 N-33333_01
    4 Z_00008_10 P-11111_01
    4 Z_00008_10 P-22222_01
    2 Z_00008_10 P-11111_01
    2 Z_00008_10 P-22222_01
    2 Z_00008_10 P-33333_01
    ... ... ...
  2. 根据 REQ 列的最大值创建子集;

    请求 套件 比较
    5 Z_00001_01 N-11111_01
    5 Z_00001_01 N-22222_01
    4 Z_00008_10 P-11111_01
    4 Z_00008_10 P-22222_01
    ... ... ...
  3. 使用公共 KIT 列作为链接在第一个查询中执行 LEFT JOIN,以将 COMP 列的值带入第一个输出表中。

    机器 项目 套件 比较
    100 FV123 Z_00001_01 N-11111_01
    100 FV123 Z_00001_01 N-22222_01
    101 KN456 Z_00008_10 P-11111_01
    101 KN456 Z_00008_10 P-22222_01
    ... ... ... ...

有什么想法可以实现我想要的结果吗?

sql sql-server left-join
1个回答
0
投票

这是一种方法:

WITH comps AS (
    SELECT  *
    FROM    (
    VALUES  (100, N'FV123', N'Z_00001_01')
    ,   (101, N'KN456', N'Z_00008_10')
) t (MACHINE,ITEM,KIT)
)
, kits AS (
    SELECT  *
    FROM    (
    VALUES  (1, N'Z_00001_01', N'N-11111_01')
    ,   (1, N'Z_00001_01', N'N-22222_01')
    ,   (1, N'Z_00001_01', N'N-33333_01')
    ,   (5, N'Z_00001_01', N'N-11111_01')
    ,   (5, N'Z_00001_01', N'N-22222_01')
    ,   (2, N'Z_00008_10', N'P-11111_01')
    ,   (2, N'Z_00008_10', N'P-22222_01')
    ,   (2, N'Z_00008_10', N'P-33333_01')
    ,   (4, N'Z_00008_10', N'P-11111_01')
    ,   (4, N'Z_00008_10', N'P-22222_01')
) t (REQ,KIT,COMP)
)
SELECT  c.MACHINE, c.ITEM, x.KIT, x.COMP
FROM    (
    SELECT  *
    ,   DENSE_RANK() OVER(PARTITION BY KIT ORDER BY Req DESC) AS sort
    FROM    kits
    ) x
LEFT JOIN comps c
    ON  c.KIT = x.KIT
WHERE   sort = 1
  1. DENSE_RANK() OVER(PARTITION BY KIT ORDER BY Req DESC) AS sort
    创建一个按 KIT 分组的排序列,从最高 Req 到最低 Req。

  2. WHERE   sort = 1
    获取上述排序中的第一个值

  3. 然后你可以执行 LEFT JOIN 来获取 comp-data。

© www.soinside.com 2019 - 2024. All rights reserved.