2017-07-24 130 views
0

這個問題類型的鏈接 my previous question.的Oracle SQL:子查詢查詢同一列兩次不同的條件下,從多張表

我試圖打破它一點剛剛得到的最後兩列有組織,無重複。

我試圖做類似最受好評的解決方案上的東西this site.

我使用的過人之處查詢生成器,試圖做到這一點,因爲我不超出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培根。指出了我俯瞰有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 

聯盟並不真正起作用,因爲它只是將兩列「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| 

這就是我一直在試圖解決

+0

究竟是什麼你想在這裏實現什麼?你應該提供一些樣本數據和預期結果。 – GurV

+0

對不起。我現在要做。這主要是在相關問題中。我不知道如果這個問題仍然存在,問題是否仍然存在。我目前正在嘗試顯示實際來自同一列的兩列,但是通過不同的條件進行了過濾。但不是4行我得到16 – spyr0

+0

如果您可以提供表格中的樣本數據以生成您所期望的輸出以及選擇值的邏輯,那麼這將非常有幫助。 – Boneist

回答

0

您樞軸後實際上是掙扎;沒有必要的連接,等

例如爲:

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

謝謝!這真的可以幫助。我唯一的問題是另外56個可能被添加到UD_DATA,所以事情可能會變得混亂,但這絕對有幫助。再次感謝 – spyr0

+0

爲什麼不直接從表中提取原始數據並使用excel來根據需要在ud_cols_ID上轉發數據? excel支持動態數據透視,而沒有dynamicSQL,你不能在SQL中擁有動態列。 – xQbert

+0

感謝您的建議,我會考慮這樣做,現在就試試。 – spyr0

相關問題