SQL插入到存在列的位置

时间:2012-08-14 09:49:57

标签: sql csv if-statement insert exists

我遇到了SQL插入语句的问题。

目前,Insert语句用于将.CSV文件中的数据传输到SQL表中,但.CSV文件的内容可能会有所不同,即它可能包含与前一列不同的列。

我用来从.CSV文件中获取数据的语句支持不同的列,因为它创建了一个与.CSV一样的临时表。

我目前使用的Insert语句是:

INSERT INTO RTCU(ItemDATE, ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr
                 ,Gfrq ,Vg1 ,Vg2 ,Vg3 ,Vg12 ,Vg23 ,Vg31, Ig1, Ig2, Ig3, Mfrq, Vm1, Vm2, Vm3
                 ,Vm12 ,Vm23 ,Vm31 ,BIN ,BOUT ,Mode ,CCpres ,OilLev
                 ,ActDem ,OilT ,AirInT ,RecAT ,JWTout ,JWTin ,JWGKin ,CylA1 ,CylA2 ,CylA3 ,CylA4 ,CylA5
                 ,CylA6 ,CylB1 ,CylB2 ,CylB3 ,CylB4 ,CylB5 ,CylB6 ,ActPwr ,kWhour ,Runhrs ,VRO)      
SELECT CONVERT(DATETIME,ItemDATE,103), ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr
                 ,Gfrq ,Vg1 ,Vg2 ,Vg3 ,Vg12 ,Vg23 ,Vg31, Ig1, Ig2, Ig3, Mfrq, Vm1, Vm2, Vm3
                 ,Vm12 ,Vm23 ,Vm31 ,BIN ,BOUT ,Mode ,CCpres ,OilLev
                 ,ActDem ,OilT ,AirInT ,RecAT ,JWTout ,JWTin ,JWGKin ,CylA1 ,CylA2 ,CylA3 ,CylA4 ,CylA5
                 ,CylA6 ,CylB1 ,CylB2 ,CylB3 ,CylB4 ,CylB5 ,CylB6 ,ActPwr ,kWhour ,Runhrs ,VRO
FROM tmpDATA

但是你可以看到我复制的列是固定的,那么如果我的一个.CSV文件有一个列“HeatMeter”怎么办呢?我该如何将这个列复制到RTCU表呢?

提前致谢!! 尼尔

1 个答案:

答案 0 :(得分:0)

我不是100%肯定我理解你的需求,但这是我最好的猜测......

你有目的地表......

 ID | val_1 | val_2 | val_3

你有一张源表......

 ID | val_1 | val_3

你有第二个源表......

 ID | val_2 | val_3

您希望将来自两个不同来源的数据插入目标表....

一个选项是在不同的列上指定默认值...

CREATE TABLE destination (
  id      INT,
  val_1   INT DEFAULT(-1),
  val_2   INT DEFAULT(-2),
  val_3   INT DEFAULT(-3)
)

-- val3 is not specified in this insert
-- This means that it will appear as -3 for all the inserted rows
------------------------------------------------------------------
INSERT INTO destination (id, val_1, val_2)
SELECT id, val_1, val_2 FROM source1

-- val1 is not specified in this insert
-- This means that it will appear as -1 for all the inserted rows
------------------------------------------------------------------
INSERT INTO destination (id, val_2, val_3)
SELECT id, val_2, val_3 FROM source2

另一种选择是简单地硬编码你想要出现在'缺失'字段中的值......

-- source1 does not have a val_3 field, so we hard-code the insert
-- to always put NULL in that field.
-------------------------------------------------------------------
INSERT INTO destination (id, val_1, val_2, val3)
SELECT id, val_1, val_2, NULL  FROM source1

-- source2 does not have a val_1 field, so we hard-code the insert
-- to always put 0 in that field.
-------------------------------------------------------------------
INSERT INTO destination (id, val_1, val_2, val_3)
SELECT id, 0,  val_2, val_3 FROM source2

任何值都可以用作默认值或硬编码值。