0

这个问题有点链接到我之前的问题。

我试图将其分解一下,以使最后两列井井有条且没有重复。

我正在尝试做一些类似于此站点上最受好评的解决方案的事情。

我正在使用 excels 查询构建器来尝试执行此操作,因为除了简单的 sql 和数据库基础知识之外,我并不熟悉。

目前声明如下:

SELECT WORK_CENTER.EQNO,
(
SELECT
UD_DATA.CUSER AS U1
FROM UD_DATA
FULL OUTER JOIN 
WORK_CENTER 
ON UD_DATA.PARENT_ID = WORK_CENTER.ID 
LEFT JOIN 
UD_COLS 
ON UD_DATA.UD_COLS_ID = UD_COLS.ID
WHERE UD_COLS.ID='16'
),
(
SELECT
UD_DATA.CUSER AS U2
FROM UD_DATA
FULL OUTER JOIN WORK_CENTER ON UD_DATA.PARENT_ID = WORK_CENTER.ID 
LEFT JOIN UD_COLS ON UD_DATA.UD_COLS_ID = UD_COLS.ID
WHERE UD_COLS.ID='17'
)

FROM   
IQMS.UD_DATA UD_DATA
FULL OUTER JOIN 
IQMS.WORK_CENTER WORK_CENTER 
ON WORK_CENTER.ID=UD_DATA.PARENT_ID
LEFT OUTER JOIN 
IQMS.UD_COLS UD_COLS 
ON 
UD_DATA.UD_COLS_ID = UD_COLS.ID 
ORDER BY WORK_CENTER.EQNO

期望的结果:

EQNO | U1   | U2
-----+------+------
001  | 1000 | test1
002  | 2000 | test2
003  | 3000 | test3
004  | 4000 | test4

但我目前正在

ORA-01427: 单行子查询返回多行 感谢 Pattrick Bacon。指出我的俯视有 LEFT JOIN JOIN

在链接的问题中,有人建议错误输出的原因是由于两个表被交叉连接,我试图在线了解它,除了尝试这个之外,我无法真正看到解决方案。

我自己并没有改变太多子查询,但我显然做错了什么。有人能帮忙吗?

有人要求提供更多示例

从我的链接问题:

这是期望的结果(不显示空白列,并对格式错误的表格表示歉意):

EQNO | CNTR_TYPE | CNTR_DESC | MFGCELL | MFG_TYPE | CUSER | U2

001 | 110T-40MM | DEMAG SYSTEM 110-430 | MOLDING | INJECTION | 1000 | test1

002 | 150T-25MM | DEMAG SYSTEM 150-320 | MOLDING | INJECTION | 2000 | test2

003 | 150T-45MM | DEMAG SYSTEM 150-610 | MOLDING | INJECTION | 3000 | test3

005 | 150T-45MM | DEMAG EXTRA  500-610 | MOLDING | INJECTION | 4000 | test4

但我得到的是:

EQNO | CNTR_TYPE | CNTR_DESC | MFGCELL | MFG_TYPE | CUSER | U2 | E2

001 | 110T-40MM | DEMAG SYSTEM 110-430 | MOLDING | INJECTION | 1000 | test1 | 001

001 | 110T-40MM | DEMAG SYSTEM 110-430 | MOLDING | INJECTION | 1000 | test2 | 002

001 | 110T-40MM | DEMAG SYSTEM 110-430 | MOLDING | INJECTION | 1000 | test3 | 003

001 | 110T-40MM | DEMAG SYSTEM 110-430 | MOLDING | INJECTION | 1000 | test4 | 005

002 | 150T-25MM | DEMAG SYSTEM 150-320 | MOLDING | INJECTION | 2000 | test1 | 001

002 | 150T-25MM | DEMAG SYSTEM 150-320 | MOLDING | INJECTION | 2000 | test2 | 002

002 | 150T-25MM | DEMAG SYSTEM 150-320 | MOLDING | INJECTION | 2000 | test3 | 003

002 | 150T-25MM | DEMAG SYSTEM 150-320 | MOLDING | INJECTION | 2000 | test4 | 005

003 | 150T-45MM | DEMAG SYSTEM 150-610 | MOLDING | INJECTION | 3000 | test1 | 001

003 | 150T-45MM | DEMAG SYSTEM 150-610 | MOLDING | INJECTION | 3000 | test2 | 002

003 | 150T-45MM | DEMAG SYSTEM 150-610 | MOLDING | INJECTION | 3000 | test3 | 003

003 | 150T-45MM | DEMAG SYSTEM 150-610 | MOLDING | INJECTION | 3000 | test4 | 005

005 | 150T-45MM | DEMAG EXTRA  500-610 | MOLDING | INJECTION | 4000 | test1 | 001 

005 | 150T-45MM | DEMAG EXTRA  500-610 | MOLDING | INJECTION | 4000 | test2 | 002

005 | 150T-45MM | DEMAG EXTRA  500-610 | MOLDING | INJECTION | 4000 | test3 | 003

005 | 150T-45MM | DEMAG EXTRA  500-610 | MOLDING | INJECTION | 4000 | test4 | 005

Union 并没有真正起作用,因为它只是将“CUSER”和“CUSER AS U2”两列放在一起,因为它们实际上是同一列。

添加更多样本数据

这是 UD_DATA 表中的一些内容

ID     | UD_COLS_ID|PARENT_ID|CUSER
-------+-----------+---------+------
12312  | 16        | 5210    | 1000
12313  | 17        | 5210    | test1
12314  | 16        | 5212    | 2000
12315  | 17        | 5212    | test2
12316  | 16        | 5213    | 3000
12317  | 17        | 5213    | test4
12318  | 16        | 5214    | 4000
12319  | 17        | 5214    | test4

我的主要问题只是将 CUSER 列中的日期显示为

      |COL1 | COL2|
      +-----+-----+
      | 1000|test1|
      | 2000|test2|
      | 3000|test3|
      | 4000|test4|

但是从链接的问题中,我得到了类似的信息:

      |COL1 | COL2|
      +-----+-----+
      | 1000|test1|
      | 1000|test2|
      | 1000|test3|
      | 1000|test4|
      | 2000|test1|
      | 2000|test2|
      | 2000|test3|
      | 2000|test4|
      | 3000|test1|
      | 3000|test2|
      | 3000|test3|
      | 3000|test4|

这就是我一直在努力解决的问题

4

1 回答 1

0

你实际上是在 PIVOT 之后;不需要连接等。

例如:

WITH ud_data AS (SELECT 12312 id, 16 ud_cols_id, 5210 parent_id, '1000' cuser FROM dual UNION ALL
                 SELECT 12313 id, 17 ud_cols_id, 5210 parent_id, 'test1' cuser FROM dual UNION ALL
                 SELECT 12314 id, 16 ud_cols_id, 5212 parent_id, '2000' cuser FROM dual UNION ALL
                 SELECT 12315 id, 17 ud_cols_id, 5212 parent_id, 'test2' cuser FROM dual UNION ALL
                 SELECT 12316 id, 16 ud_cols_id, 5213 parent_id, '3000' cuser FROM dual UNION ALL
                 SELECT 12317 id, 17 ud_cols_id, 5213 parent_id, 'test3' cuser FROM dual UNION ALL
                 SELECT 12318 id, 16 ud_cols_id, 5214 parent_id, '4000' cuser FROM dual UNION ALL
                 SELECT 12319 id, 17 ud_cols_id, 5214 parent_id, 'test4' cuser FROM dual)
SELECT parent_id,
       col1,
       col2
FROM   (SELECT parent_id,
               ud_cols_id,
               cuser
        FROM   ud_data)
PIVOT (max(cuser) FOR (ud_cols_id) IN (16 AS col1, 17 AS col2))
ORDER BY parent_id;

 PARENT_ID COL1  COL2
---------- ----- -----
      5210 1000  test1
      5212 2000  test2
      5213 3000  test3
      5214 4000  test4
于 2017-07-24T14:59:57.773 回答