简体   繁体   English

Oracle SQL:子查询在多个表中以不同条件两次查询同一列

[英]Oracle SQL: Subqueries to query same column twice under different condition from mulitple tables

This question kind of links to my previous question. 这个问题与我以前的问题有关。

I'm trying to break it down a little to just get the last two columns organized and without duplicates. 我正在尝试将其分解,以使最后两列井井有条,并且没有重复。

I'm attempting to do something similar to the top rated solution on this site. 我正在尝试做与该网站上评分最高的解决方案相似的事情

I'm using excels query builder to try and do this as I am not that familiar beyond simple basics of sql and databases. 我正在使用excels查询生成器来尝试执行此操作,因为我对SQL和数据库的简单基础知识并不熟悉。

The statement is currently: 该语句当前为:

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

Desired Result: 所需结果:

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

But I'm currently getting 但是我现在正在

ORA-01427: single-row subquery returns more than one row Thanks to Pattrick Bacon. ORA-01427:单行子查询返回的行多于Pattrick Bacon。 Pointed out my overlooking having LEFT JOIN JOIN 指出我忽略了LEFT JOIN JOIN

In the linked question it was suggested that the cause of the wrong output was due to the two tables being cross joined, I tried to get an understanding of it online and I was unable to really see a solution around it except for trying this. 在链接的问题中,有人提出错误输出的原因是由于两个表被交叉连接所致,我试图在线了解它,除了尝试此操作外,我无法真正看到解决方案。

I haven't changed too much of the subqueries themselves but I'm obviously doing something wrong. 我自己并没有改变太多子查询,但是显然我做错了什么。 would anyone be able to help? 任何人都可以提供帮助吗?

Someone asked for more examples 有人要求更多示例

From my linked question: 从我的链接问题:

This is the desired result(not showing blank columns and apologies for badly formatted table): 这是理想的结果(不显示表格格式错误的空白列和歉意):

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

But what I'm getting is: 但是我得到的是:

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 doesn't really work as it just puts the two columns "CUSER" and "CUSER AS U2" together since they are the same column really. Union并没有真正起作用,因为它只是将“ CUSER”和“ CUSER AS U2”两列放在一起,因为它们实际上是同一列。

Adding more sample data 添加更多样本数据

Here's a bit from the UD_DATA table 这是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

My main issue is just displaying the date from the CUSER column as 我的主要问题是将CUSER列中的日期显示为

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

But from the linked question I got something like: 但是从链接的问题中我得到了类似的东西:

      |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|

This is what I've been struggling with trying to fix 这就是我一直在努力解决的问题

You're actually after a PIVOT; 您实际上是在追求PIVOT; no need for the joins, etc. 不需要加入,等等。

Eg: 例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM