【发布时间】:2020-03-25 11:26:45
【问题描述】:
我有一个表结构,其中包含以逗号分隔值的列中的数据。我想将这些值分成几行。
表中的数据是这样的
MANUFACTURER_PART_NUMBER|MANUFACTURER_NAME |TEST_PLAN |ATTACHED_SUPPLIER_DOCUMENT |ATTACHED_LOGITECH_REPORT|
------------------------|-------------------------|--------------------|---------------------------|------------------------|
001059-0000 |CHENGDA |268452,268453 |268456,268457,268459,268460|268465 |
001059-0000 |SHANGHAI MARRISON CO.,LTD| |268458,268462 | |
001059-0000 |SUZHOU SHARETECH | | | |
001059-0000 |SYSTRON |268451,268452,268453|268456,268457,268459,268460|268465,268466 |
我已经尝试过这个查询,但它表现不佳,不确定原因
WITH CTE AS(
SELECT DISTINCT
MP.PART_NUMBER MANUFACTURER_PART_NUMBER, M.NAME MANUFACTURER_NAME,
RTRIM(LTRIM(PG3.MULTILIST31, ','), ',') TEST_PLAN,
RTRIM(LTRIM(PG3.MULTILIST32, ','), ',') ATTACHED_SUPPLIER_DOCUMENT,
RTRIM(LTRIM(PG3.MULTILIST33, ','), ',') ATTACHED_LOGITECH_REPORT
FROM MANU_PARTS MP
INNER JOIN MANUFACTURERS M ON M.ID = MP.MANU_ID
LEFT JOIN PAGE_TWO PG2 ON PG2.ID = MP.ID
LEFT JOIN PAGE_THREE PG3 ON PG3.ID = MP.ID
WHERE PART_NUMBER = '001059-0000'
)
SELECT DISTINCT
MANUFACTURER_PART_NUMBER, MANUFACTURER_NAME,
REGEXP_SUBSTR(TEST_PLAN, '[^,]+', 1, LEVEL) TEST_PLAN,
REGEXP_SUBSTR(ATTACHED_SUPPLIER_DOCUMENT, '[^,]+', 1, LEVEL) ATTACHED_SUPPLIER_DOCUMENT,
REGEXP_SUBSTR(ATTACHED_LOGITECH_REPORT, '[^,]+', 1, LEVEL) ATTACHED_LOGITECH_REPORT
FROM CTE
CONNECT BY REGEXP_SUBSTR(NVL(NVL(TEST_PLAN, ATTACHED_SUPPLIER_DOCUMENT), ATTACHED_LOGITECH_REPORT), '[^,]+', 1, LEVEL) IS NOT NULL
ORDER BY MANUFACTURER_NAME
它应该给出以下也是必需的输出
MANUFACTURER_PART_NUMBER|MANUFACTURER_NAME |TEST_PLAN|ATTACHED_SUPPLIER_DOCUMENT|ATTACHED_LOGITECH_REPORT|
------------------------|-------------------------|---------|--------------------------|------------------------|
001059-0000 |CHENGDA |268452 |268456 |268465 |
001059-0000 |CHENGDA |268453 |268457 | |
001059-0000 |CHENGDA | |268459 | |
001059-0000 |CHENGDA | |268460 | |
001059-0000 |SHANGHAI MARRISON CO.,LTD| |268458 | |
001059-0000 |SHANGHAI MARRISON CO.,LTD| |268462 | |
001059-0000 |SUZHOU SHARETECH | | | |
001059-0000 |SYSTRON |268451 |268456 |268465 |
001059-0000 |SYSTRON |268452 |268457 |268466 |
001059-0000 |SYSTRON |268453 |268459 | |
001059-0000 |SYSTRON | |268460 | |
但相反,它给出了这个输出并且缺少 2 行或第一行 CHENGDA 和最后 1 行 SYSTRON 的值
MANUFACTURER_PART_NUMBER|MANUFACTURER_NAME |TEST_PLAN|ATTACHED_SUPPLIER_DOCUMENT|ATTACHED_LOGITECH_REPORT|
------------------------|-------------------------|---------|--------------------------|------------------------|
001059-0000 |CHENGDA |268452 |268456 |268465 |
001059-0000 |CHENGDA |268453 |268457 | |
001059-0000 |SHANGHAI MARRISON CO.,LTD| |268458 | |
001059-0000 |SHANGHAI MARRISON CO.,LTD| |268462 | |
001059-0000 |SUZHOU SHARETECH | | | |
001059-0000 |SYSTRON |268451 |268456 |268465 |
001059-0000 |SYSTRON |268452 |268457 |268466 |
001059-0000 |SYSTRON |268453 |268459 | |
我发现的原因是当我在 Connect By 子句中交换 Test Plan 和 Attached Supplier Document 的位置时,这可能是因为两列中的值数量。但这不应该发生,因为如果测试计划在任何情况下都有更多的价值呢?
希望有人能提供帮助。
(在将此问题标记为重复之前,请先询问它是否已经有答案,因为该查询不起作用)
【问题讨论】:
-
修复你的数据模型!不要在字符串中存储多个值!不要将数字存储在字符串中!声明外键关系!
-
您所追求的结果表明测试计划 268453 和供应商文档 268457 之间存在关系,只是因为它们都是列表中的第二个元素。这似乎是一种相当随意的关联事物的方式——即使列表总是具有相同数量的元素,它也很狡猾,但是当它们发生变化时,你怎么知道什么应该与什么相关联? (或者它们是否具有相同的编号,并且您的 ltrim/rtrim 正在删除该潜在的伪链接?)
-
@GordonLinoff 无法真正更改数据模型。它是 Oracle 的敏捷数据库。
-
通过 API 调用执行此操作可能更简单——您是否应该直接访问 Agile 数据库进行此类操作?
-
@MuhammadAsim - 你已经为此付出了很多,但你没有说现有答案有什么问题(这恰好是我的,但这不是重点)。如果这不能满足您的需要,请对该答案进行评论,解释原因,并在必要时为您的问题添加更多详细信息。