我通过两个不同的查询获得了两个不同的表,如下所示:
第一表:
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 |
... | ... | ... |
不幸的是,我正在努力实现以下目标:
按 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 |
... | ... | ... |
根据 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 |
... | ... | ... |
使用公共 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 |
... | ... | ... | ... |
有什么想法可以实现我想要的结果吗?
这是一种方法:
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
DENSE_RANK() OVER(PARTITION BY KIT ORDER BY Req DESC) AS sort
创建一个按 KIT 分组的排序列,从最高 Req 到最低 Req。
WHERE sort = 1
获取上述排序中的第一个值
然后你可以执行 LEFT JOIN 来获取 comp-data。