我有 3 個表,比如 TabA、TabB 和 TabC。以下是這些表中一些有用的列:
TabA(ID VARCHAR2 Primary Key, ..)
TabB(ID VARCHAR2, Value CHAR(1), LastUpdated Date)
TabC(ID VARCHAR2 Primary Key, Value CHAR(1), LastUpdated Date)
這Value是一個標志“Y”或“N”。我想使用這 3 個表來獲取所有IDs 和它們。Value首先,我想查看所有ID表中存在的所有 distinct 。由于Value不在 TabA 中,我將Value僅在 TabB 和 TabC 中查找。如果對于特定ID的 ,Value任何表中都不存在,我將假定它為“N”。假設某個特定ID的值在 TabB 和 TabC 中,我想取更大的Value地方。LastUpdated
我嘗試過使用回圈,但這不是非常有效的解決方案。我只需要結果游標中的KeyandValue并希望為此保留一個查詢。
有人可以幫助確定比使用回圈更好的解決方案。
編輯 -
這是一個示例:
假設 TabA 是 -
| ID |
|---|
| 100 |
| 101 |
| 102 |
TabB 是 -
| ID | 價值 | 最近更新時間 |
|---|---|---|
| 99 | 是 | 22 年 5 月 21 日 |
| 100 | ? | 22-5-22 |
| 103 | ? | 22 年 5 月 23 日 |
TabC 是 -
| ID | 價值 | 最近更新時間 |
|---|---|---|
| 102 | 是 | 22 年 5 月 20 日 |
| 103 | 是 | 22 年 5 月 24 日 |
| 104 | ? | 22 年 5 月 21 日 |
結果應該是——
| ID | 價值 | 為什么? |
|---|---|---|
| 99 | 是 | 來自 TabB |
| 100 | ? | 來自 TabB |
| 101 | ? | 僅在 TabA 中默認 N |
| 102 | 是 | 來自 TabC |
| 103 | 是 | 在 TabB 和 TabC 中,但 LastUpdated 在 TabC 中更大,因此取 TabC 值 |
| 104 | ? | 來自 TabC |
編輯 -
如果 ID 在 TabB 和 TabC 中具有相同的 LastUpdated 但值不同,則預期結果 - 這可以忽略,因為這種情況很少見。我們可以假設這永遠不會發生。
uj5u.com熱心網友回復:
你可以嘗試這樣的事情:
SELECT id, value FROM
(SELECT id, value, ROW_NUMBER()
OVER (PARTITION BY id ORDER BY lastupdated DESC) AS rownr
FROM
(SELECT id, 'N' AS value, sysdate AS lastupdated FROM taba
WHERE id NOT IN (SELECT id FROM tabb)
AND id NOT IN (SELECT id FROM tabc)
UNION
SELECT id, value, MAX(lastupdated) AS lastupdated
FROM tabb
GROUP BY id, value
UNION
SELECT id, value, MAX(lastupdated) AS lastupdated
FROM tabc
GROUP BY id, value
ORDER BY id, lastupdated DESC)) WHERE rownr = 1;
至少在我的小提琴示例中,這可以正常作業:db<>fiddle
uj5u.com熱心網友回復:
ID如果 an具有相同LastUpdated的 inTabB和TabC不同Value的 s ,請定義預期結果。在跟隨它是未定義的。
WITH BC AS (
SELECT ID, VALUE FROM (
SELECT ID, VALUE,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LastUpdated DESC) r
FROM (
SELECT ID, Value, MAX(LastUpdated) AS LastUpdated
FROM TabB
GROUP BY ID, Value
UNION ALL
SELECT ID, Value, MAX(LastUpdated) AS LastUpdated
FROM TabC
GROUP BY ID, Value
)
)
WHERE R = 1
)
SELECT ID, VALUE FROM BC
UNION ALL
SELECT ID, 'N' VALUE FROM tabA A
WHERE A.ID NOT IN (
SELECT ID FROM BC
)
ORDER BY ID;
uj5u.com熱心網友回復:
用于UNION從多個表創建單個資料集。然后,過濾該資料集。
SELECT ID, Value
FROM
(
SELECT ID, Value, MAX(LastUpdated) AS LastUpdated
FROM TabB
GROUP BY ID, Value
UNION ALL
SELECT ID, Value, MAX(LastUpdated) AS LastUpdated
FROM TabC
GROUP BY ID, Value
) t
WHERE ID IN
(
SELECT DISTINCT ID
FROM TabA
)
AND
(
Value = 'Y' OR
NOT EXISTS
(
SELECT 1
FROM
(
SELECT ID, Value
FROM
(
SELECT ID, Value, MAX(LastUpdated) AS LastUpdated
FROM TabB
GROUP BY ID, Value
UNION ALL
SELECT ID, Value, MAX(LastUpdated) AS LastUpdated
FROM TabC
GROUP BY ID, Value
) t
WHERE ID = t.ID
)
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482730.html
下一篇:我如何實際洗掉節點?
