【发布时间】:2022-01-02 16:26:59
【问题描述】:
CREATE TABLE tab1
(
e_id VARCHAR2(255),
e_date VARCHAR2(255),
t_ref_num VARCHAR2(255),
CONSTRAINT pk_tab1 PRIMARY KEY ( e_id )
);
INSERT INTO tab1 VALUES (1, '01-01-2000', 11);
INSERT INTO tab1 VALUES (2, '01-01-2001', 12);
INSERT INTO tab1 VALUES (3, '01-01-2002', 13);
CREATE TABLE tab2
(
e_id NUMBER(20),
e_date DATE,
t_ref_num NUMBER(20),
CONSTRAINT pk_tab2 PRIMARY KEY ( e_id )
);
我需要将它插入到tab2表中,并且需要根据tab2表数据类型转换数据类型。因为在 tab1 表中我总是会得到 varchar 数据类型,但是在插入 tab2 表时我必须对其进行类型转换并且必须插入正确的数据类型。我怎样才能做到这一点?
MERGE INTO tab2 tt
USING (SELECT
e_id, e_date, _t_ref_num
FROM tab1) t1 ON ( t2.e_id = t1.e_id )
WHEN MATCHED THEN
UPDATE
SET tt.e_date = t1.e_date,
tt.t_ref_num = t1.t_ref_num
WHEN NOT MATCHED THEN
INSERT (e_id, e_date, t_ref_num)
VALUES (t1.e_id, t1.e_date, t1.t_ref_num);
我只需要在合并语句中进行更改。
【问题讨论】:
-
你只是有一点错别字。看看this。顺便说一句,更喜欢将日期值存储在 DATE 类型列中。
-
嗨@Littlefoot。我都做了。到目前为止的故事看起来很漂亮,但产出的产品毫无意义。正如我已经告诉过的,有一些拼写错误,例如列
t_ref_num不应以_为前缀,表tab2应适当地使用别名,并且在提供的插入期间需要TO_DATE转换存储日期列的决定保持不变。 -
@Barbaros,感谢您不羞于回复。大多数人不会那样做。至于你的反对意见:
_错字是一个小错误(从我的角度来看)。我不太明白tab2表的别名有什么问题(MERGE 中的tt,对吗?),而在 INSERT 中根本不应该使用TO_DATE,因为目标列的数据类型是 VARCHAR2。如果关于 SO 的大多数问题看起来都像这样,我会非常高兴。 -
谢谢你@Littlefoot 我很感激。
tab2(某处tt,t2)的别名存在混淆,实际上只需将t2替换为tt就足够了。目标表(tab2)的e_date列具有DATE类型而不是VARCHAR2... -
啊,我现在明白了! t2 vs. tt ...对,我什至没有注意到,因为我正在编写自己的 MERGE 并避免它:) INSERT 仅用于 tab1; Vicky 已经说过她(我猜是“她”)不知道如何应用 TO_DATE(合并时)。好的,就我而言,就是这样。我希望你做得很好,顺便说一句:)