Oracle SQL 查询在“金字塔”提取中检索值?

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

请注意,我不知道这种“金字塔格式”是否有正式名称:我可能使用了不正确的约定。

我需要创建一个能够从此表中获取数据的 SQL 脚本。

Pyramid Configuration Table

这个想法是在进行 JOIN 时优先考虑信息最多的记录。意思应该是:

  1. PCLITM
  2. 如果 PCLITM 为空,则为 PCPRODM。
  3. 如果 PCPRODM 为空,则为 PCPRODF。

...等等。

我需要从配置表中提取结果值 VAL,但总需要有一个结果,这意味着非精确匹配是可以接受的。

enter image description here

以表 DOCO 10003 为例:最佳匹配是 MCU 112、MPF 431 和 AN8 9999 的组合,而 PRODF、PRODM 和 LITM 为空。

我试图避免的是进行多个 JOIN 来实现结果,所以我想联系一下,看看您是否知道更有效的选择。

这是模拟两个表的示例 SQL。

WITH PYRAMID_TABLE AS (
    SELECT '112' MCU, '431' MPF, 9999 AN8, 'VAL001' PRODF, 'VAL002' PRODM, 'TEST-MR-001' LITM, 'Value001' VAL FROM DUAL UNION
    SELECT '112' MCU, '431' MPF, 9999 AN8, 'VAL001' PRODF, 'VAL002' PRODM, ' ' LITM, 'Value002' FROM DUAL UNION
    SELECT '112' MCU, '431' MPF, 9999 AN8, 'VAL001' PRODF, ' ' PRODM, ' ' LITM, 'Value003' FROM DUAL UNION
    SELECT '112' MCU, '431' MPF, 9999 AN8, ' ' PRODF, ' ' PRODM, ' ' LITM, 'Value004' FROM DUAL UNION
    SELECT '112' MCU, '431' MPF, 0 AN8, ' ' PRODF, ' ' PRODM, ' ' LITM, 'Value005' FROM DUAL UNION
    SELECT '112' MCU, ' ' MPF, 0 AN8, ' ' PRODF, ' ' PRODM, ' ' LITM, 'Value006' FROM DUAL),
     TRANSACTION_TABLE AS (
        SELECT 10001 DOCO, '112' MCU, '431' MPF, 9999 AN8, 'VAL001' PRODF, 'VAL002' PRODM, 'TEST-MR-001' LITM, 'Value001' Fetch_result FROM DUAL UNION
        SELECT 10002 DOCO, '112' MCU, '431' MPF, 9999 AN8, 'VAL001' PRODF, 'VAL003' PRODM, 'TEST-MR-098' LITM, 'Value003' FROM DUAL UNION
        SELECT 10003 DOCO, '112' MCU, '431' MPF, 9999 AN8, 'VAL014' PRODF, 'VAL055' PRODM, 'TEST-MR-005' LITM, 'Value004' FROM DUAL UNION
        SELECT 10004 DOCO, '112' MCU, '431' MPF, 9999 AN8, 'VAL012' PRODF, 'VAL050' PRODM, 'TEST-MR-023' LITM, 'Value004' FROM DUAL UNION
        SELECT 10005 DOCO, '112' MCU, '345' MPF, 1293 AN8, 'STK001' PRODF, 'STK067' PRODM, 'TEST-MR-004' LITM, 'Value006' FROM DUAL)
---- ---- ---- ---- ---- ---- ---- ----
SELECT * FROM TRANSACTION_TABLE;
--SELECT * FROM PYRAMID_TABLE;

编辑 1:只是澄清一下:目的不是排序这个金字塔,使其如图所示,而是能够在两个表之间进行提取。对于任何误解,我们深表歉意。

sql plsql oracle-sqldeveloper
1个回答
0
投票

您可以通过 ORDER BY 子句来控制它

SELECT * 
FROM MAIN_TABLE
ORDER BY  coalesce(LITM,' ') desc, 
          coalesce(PRODM,' ') desc, 
          coalesce(PRODF,' ') desc, 
          coalesce(AN8,0) desc, 
          coalesce(MPF,' ') desc

为了测试空格和 NULL 以相同的方式排序(空白-空),我必须修改您的示例。我将具有 5 个值的记录的空间更改为 NULL 112 431 9999 VAL001 VAL002 空

小提琴

单片机 强积金 AN8 产品 产品DM LITM
112 431 9999 VAL001 VAL002 测试-MR-001
112 431 9999 VAL001 VAL002  NULL
112 431 9999 VAL001
112 431 9999
112 431 0
112 0
© www.soinside.com 2019 - 2024. All rights reserved.