T1
Code、ByName、ObjectName 。。。
aa 0 橡皮 。。。
bb 0 鉛筆 。。。
cc 0 尺子 。。。
T2
Code、ByName、ObjectName 。。。
AA Aa 橡皮 。。。
BB Bb 鉛筆 。。。
CC 0 尺子 。。。
最后我希望得到的 T2 像這樣:
Code、ByName、ObjectName 。。。
AA Aa 橡皮 。。。(ByName不為為空)
AA aa 橡皮 。。。(增加一條記錄,其他欄位值跟上面的記錄相同)
BB Bb 鉛筆 。。。
BB bb 鉛筆 。。。
CC cc 尺子 。。。(ByName為空的,直接修改即可)
希望四海八荒的各位上神給支支招,先謝過諸位上神。
uj5u.com熱心網友回復:
WITH T1 AS
(SELECT 'aa' CODE, '0' BYNAME, '橡皮' OBJECTNAME
FROM DUAL
UNION ALL
SELECT 'bb', '0', '鉛筆'
FROM DUAL
UNION ALL
SELECT 'cc', '0', '尺子'
FROM DUAL),
T2 AS
(SELECT 'AA' CODE, 'Aa' BYNAME, '橡皮' OBJECTNAME
FROM DUAL
UNION ALL
SELECT 'BB', 'Bb', '鉛筆'
FROM DUAL
UNION ALL
SELECT 'CC', '0', '尺子'
FROM DUAL)
SELECT NVL(A.CODE, C.CODE) AS CODE,
NVL(NULLIF(A.BYNAME, '0'), B.CODE) AS BYNAME,
NVL(A.OBJECTNAME, B.OBJECTNAME) AS OBJECTNAME
FROM T2 A
FULL JOIN T1 B
ON A.OBJECTNAME = B.OBJECTNAME
AND (A.BYNAME = B.BYNAME OR A.BYNAME = '0')
LEFT JOIN T2 C
ON C.OBJECTNAME = B.OBJECTNAME
ORDER BY CODE, BYNAME
uj5u.com熱心網友回復:
MERGE INTO T2 A
USING (SELECT T1.*, DECODE(T2.BYNAME, '0', 1, 0) AS FLAG, T2.CODE AS NEW_CODE
FROM T1
LEFT JOIN T2
ON T2.OBJECTNAME = T1.OBJECTNAME
AND (T1.BYNAME <> T2.BYNAME OR T2.BYNAME = '0')) B
ON (A.OBJECTNAME = B.OBJECTNAME AND B.FLAG = 1)
WHEN MATCHED THEN
UPDATE
SET A.BYNAME = B.CODE
WHEN NOT MATCHED THEN
INSERT
VALUES
(B.NEW_CODE, B.CODE, B.OBJECTNAME)
更新的SQL
uj5u.com熱心網友回復:
這位上神,感謝您百忙之中給我的回復,可不可以不用merge來實作呢,我用得是Access資料庫。
uj5u.com熱心網友回復:
access比較古老,不會的話你就多寫幾條SQL執行把。
uj5u.com熱心網友回復:
MERGE INTO T2 A
USING (SELECT T1.*, DECODE(T2.BYNAME, '0', 1, 0) AS FLAG, T2.CODE AS NEW_CODE
FROM T1
LEFT JOIN T2
ON T2.OBJECTNAME = T1.OBJECTNAME
AND (T1.BYNAME <> T2.BYNAME OR T2.BYNAME = '0')) B
ON (A.OBJECTNAME = B.OBJECTNAME AND B.FLAG = 1)
WHEN MATCHED THEN
UPDATE
SET A.BYNAME = B.CODE
WHEN NOT MATCHED THEN
INSERT
VALUES
(B.NEW_CODE, B.CODE, B.OBJECTNAME)
更新的SQL
這位上神,感謝您百忙之中給我的回復,可不可以不用merge來實作呢,我用得是Access資料庫。
access比較古老,不會的話你就多寫幾條SQL執行把。
這樣,我都匯入到Oracle了,執行陳述句的時候出現以下錯誤:
[Err] ORA-00904: "T2"."BYNAME": 識別符號無效
還請上神指點指點。
uj5u.com熱心網友回復:
看看表結構,t2表有沒BYNAME欄位,名稱有沒有拼錯
uj5u.com熱心網友回復:
BEGIN
FOR C_ROW IN(SELECT CODE,BYNAME,OBJECTNAME FROM T1)LOOP
IF C_ROW.BYNAME<>NULL AND C_ROW.BYNAME<>C_ROW.CODE THEN
EXECUTE IMMEDIATE 'INSERT INTO T2 VALUES(...)';
ELSE THEN
EXECUTE IMMEDIATE 'UPDATE T2 SET BYNAME='||C_ROW.CODE||'WHERE OBJECTNAME='||C_ROW.OBJECTNAME;
END IF;
END LOOP;
END;
**桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......
我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......
關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......