我有這張表 INCIDENTCHAPTER。每個 INCIDENTCHAPTER_ID 都是唯一的
| INCIDENTCHAPTER_ID | …… |
|---|---|
| 1 | |
| 2 | |
| 3 |
還有這個分表LABEL。每個 INCIDENTCHAPTER_ID 必須有一個名稱和短名稱,但幫助是可選的。所以它看起來像這樣。
| INCIDENTCHAPTER_ID | 文本型別 | 文本 |
|---|---|---|
| 1 | 姓名 | 警報 |
| 1 | 簡稱 | 一種 |
| 1 | 幫助 | 一些幫助文本 |
| 2 | 姓名 | 通知 |
| 2 | 簡稱 | ? |
| 2 | 幫助 | 另一個幫助文本 |
| 3 | 姓名 | 第一章 |
| 3 | 簡稱 | 1 |
我有這個sql:
SELECT
INCIDENTCHAPTER.INCIDENTCHAPTER_ID,
N.TEXT AS NAME,
SN.TEXT AS SHORTNAME,
H.TEXT AS HELP
FROM
REM_DBA.INCIDENTCHAPTER
LEFT JOIN LABEL N ON INCIDENTCHAPTER.INCIDENTCHAPTER_ID = N.INCIDENTCHAPTER_ID
LEFT JOIN LABEL SN ON INCIDENTCHAPTER.INCIDENTCHAPTER_ID = SN.INCIDENTCHAPTER_ID
LEFT JOIN LABEL H ON INCIDENTCHAPTER.INCIDENTCHAPTER_ID = H.INCIDENTCHAPTER_ID
WHERE
N.TEXTTYPE = 'Name' AND
SN.TEXTTYPE = 'ShortName' AND
H.TEXTTYPE = 'Help'
| INCIDENTCHAPTER_ID | 姓名 | 簡稱 | 幫助 |
|---|---|---|---|
| 1 | 警報 | 一種 | 一些幫助文本 |
| 2 | 通知 | ? | 另一個幫助文本 |
但它只會讓我獲得 INCIDENTCHAPTER_ID 1 和 2。因為 INCIDENTCHAPTER_ID 3 沒有幫助。
什么是正確的 sql 使它看起來像:
| INCIDENTCHAPTER_ID | 姓名 | 簡稱 | 幫助 |
|---|---|---|---|
| 1 | 警報 | 一種 | 一些幫助文本 |
| 2 | 通知 | ? | 另一個幫助文本 |
| 3 | 第一章 | 1 |
uj5u.com熱心網友回復:
將過濾器從WHERE子句移動到相應的ON子句:
SELECT ic.INCIDENTCHAPTER_ID,
N.TEXT AS NAME,
SN.TEXT AS SHORTNAME,
H.TEXT AS HELP
FROM REM_DBA.INCIDENTCHAPTER ic
LEFT JOIN LABEL N
ON ( ic.INCIDENTCHAPTER_ID = N.INCIDENTCHAPTER_ID
AND N.TEXTTYPE = 'Name')
LEFT JOIN LABEL SN
ON ( ic.INCIDENTCHAPTER_ID = SN.INCIDENTCHAPTER_ID
AND SN.TEXTTYPE = 'ShortName')
LEFT JOIN LABEL H
ON ( ic.INCIDENTCHAPTER_ID = H.INCIDENTCHAPTER_ID
AND H.TEXTTYPE = 'Help')
如果將它們放在WHERE子句中,那么這些值是強制性的,并且LEFT JOINs 有效地變為INNER JOINs,因為必須有一個與WHERE過濾器匹配的值。
其中,對于樣本資料:
CREATE TABLE INCIDENTCHAPTER (INCIDENTCHAPTER_ID PRIMARY KEY) AS
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 3;
CREATE TABLE label (INCIDENTCHAPTER_ID, TEXTTYPE, TEXT) AS
SELECT 1, 'Name', 'Alert' FROM DUAL UNION ALL
SELECT 1, 'ShortName', 'A' FROM DUAL UNION ALL
SELECT 1, 'Help', 'Some Helptext' FROM DUAL UNION ALL
SELECT 2, 'Name', 'Notification' FROM DUAL UNION ALL
SELECT 2, 'ShortName', 'N' FROM DUAL UNION ALL
SELECT 2, 'Help', 'Another Helptext' FROM DUAL UNION ALL
SELECT 3, 'Name', 'Chapter One' FROM DUAL UNION ALL
SELECT 3, 'ShortName', '1' FROM DUAL;
輸出:
INCIDENTCHAPTER_ID 姓名 簡稱 幫助 1 警報 一種 一些幫助文本 2 通知 ? 另一個幫助文本 3 第一章 1 空值
或者,您可以使用單個連接,然后PIVOT:
SELECT *
FROM (
SELECT ic.incidentchapter_id,
l.texttype,
l.text
FROM /*REM_DBA.*/INCIDENTCHAPTER ic
LEFT OUTER JOIN LABEL l
ON ( ic.INCIDENTCHAPTER_ID = l.INCIDENTCHAPTER_ID)
)
PIVOT (
MAX(text) FOR texttype IN (
'Name' AS name,
'ShortName' AS shortname,
'Help' AS help
)
);
它為您的示例資料提供相同的輸出(但如果一章中有多行 a 則不會提供相同的資料texttype)。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442072.html
