2012-04-06 57 views
1

我一直在尋找無處不在,找不到像這樣的東西。我有兩個表格,表格t1有每個a1的值,b1的值對於所有的a1都是靜態的,只有一個入口。主鍵不是a1b1t1也有其他所有的靜態列a1MYSQL多行插入不存在

表二t2a2b2值不是靜態的。 a2b2都不是主鍵(我使用主鍵的獨立ID列)。

我的目標是導入t1中不存在的所有a2值。請記住,表1目前有大約200萬條記錄,而表2通常有150K-1M條目。

這個工程:

INSERT t1 (a1, b1, c1, d1) 
SELECT a2, b2, 'constant1', 'constant2' 
FROM t2 AS V2 
WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE a1=V2.a2) 

,但只進入一個a2進入t1,留下缺少的條目。

這是我的想法:

SELECT a2, b2 FROM t2 AS V2 
INSERT INTO t1 (a1, b1, c1, d1) 
     VALUES (V2.a2, V2.b2, 'constant1', 'constant2'), 
       (V2.a2, 'constant3', 'constant1', 'constant2'), 
       (V2.a2, 'constant4', 'constant1', 'constant2'), 
       (V2.a2, 'constant5', 'constant1', 'constant2'), 
       (V2.a2, 'constant6', 'constant1', 'constant2'), 
       (V2.a2, 'constant7', 'constant1', 'constant2'), 
       (V2.a2, 'constant8', 'constant1', 'constant2'), 
       (V2.a2, 'constant9', 'constant1', 'constant2'), 
       (V2.a2, 'constant10', 'constant1', 'constant2'), 
       (V2.a2, 'constant11', 'constant1', 'constant2'), 
       (V2.a2, 'constant12', 'constant1', 'constant2'), 
       (V2.a2, 'constant13', 'constant1', 'constant2') 
WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE a1=V2.a2) 

是這樣的可能嗎? (這顯然不起作用,主要的語法錯誤)。

樣品DATA FROM實際的表:

+---------+------+-------------+-------------+--------------+ 
| id  | name | destination | application | durationRate | 
+---------+------+-------------+-------------+--------------+ 
| 45013 | 1 | 1305200  | audio  | 0   | 
| 335203 | 2 | 1305200  | audio  | 0.014  | 
| 625393 | 3 | 1305200  | audio  | 0.005928  | 
| 956657 | 4 | 1305200  | audio  | 0   | 
| 1251735 | 5 | 1305200  | audio  | 0   | 
| 1560365 | 6 | 1305200  | audio  | 0.02   | 
| 1868995 | 7 | 1305200  | audio  | 0.014  | 
| 2200259 | 9 | 1305200  | audio  | 0.014  | 
| 2517971 | 10 | 1305200  | audio  | 0.018  | 
| 2813049 | 11 | 1305200  | audio  | 0.018  | 
| 3121679 | 12 | 1305200  | audio  | 0.00775  | 
| 3430309 | 8 | 1305200  | audio  | 0   | 
| 45015 | 1 | 1305201  | audio  | 0   | 
| 335205 | 2 | 1305201  | audio  | 0.014  | 
| 625395 | 3 | 1305201  | audio  | 0.006552  | 
| 956659 | 4 | 1305201  | audio  | 0   | 
| 1251737 | 5 | 1305201  | audio  | 0   | 
| 1560367 | 6 | 1305201  | audio  | 0.02   | 
| 1868997 | 7 | 1305201  | audio  | 0.014  | 
| 2200261 | 9 | 1305201  | audio  | 0.014  | 
| 2517973 | 10 | 1305201  | audio  | 0.018  | 
| 2813051 | 11 | 1305201  | audio  | 0.018  | 
| 3121681 | 12 | 1305201  | audio  | 0.00775  | 
| 3430311 | 8 | 1305201  | audio  | 0   | 
| 45017 | 1 | 1305202  | audio  | 0   | 
| 335207 | 2 | 1305202  | audio  | 0.014  | 
| 625397 | 3 | 1305202  | audio  | 0.00468  | 
| 956661 | 4 | 1305202  | audio  | 0   | 
| 1251739 | 5 | 1305202  | audio  | 0   | 
| 1560369 | 6 | 1305202  | audio  | 0.02   | 
| 1868999 | 7 | 1305202  | audio  | 0.014  | 
| 2200263 | 9 | 1305202  | audio  | 0.014  | 
| 2517975 | 10 | 1305202  | audio  | 0.018  | 
| 2813053 | 11 | 1305202  | audio  | 0.018  | 
| 3121683 | 12 | 1305202  | audio  | 0.00775  | 
| 3430313 | 8 | 1305202  | audio  | 0   | 
+---------+------+-------------+-------------+--------------+ 
36 rows in set (0.00 sec) 

在我的示例表,a1 = destinationb1 = durationRatec1 = named1 = application 有12層不同的速率通過name定義甲板。

+0

爲什麼你希望它從T2插入12行至t1?如果你從t1和t2的每一個顯示少量的樣本數據,那麼你可能會更清楚,因此你期望插入t1的哪些行? – kaj 2012-04-06 06:50:16

+0

肯定沒有問題 – necival 2012-04-06 16:08:42

回答

2

where子句中使用更具體的條件。我在這裏添加了另一列,但它只能使用id對a1b1是唯一的,如果它不是你應該添加更多的列條件。

INSERT t1 (a1, b1, c1, d1) 
SELECT a2, b2, 'constant1', 'constant2' 
FROM t2 AS V2 
WHERE NOT EXISTS (
    SELECT 1 
    FROM t1 WHERE a1 = V2.a2 and b1 = V2.b2 
) 
+0

因此,首先我應該有一個命令填充t2與每個a2的其他11個條目? – necival 2012-04-06 06:03:22

+0

感謝您的快速響應,順便說一句 – necival 2012-04-06 06:03:54

+0

@necival,不,不完全。在t1表中,你希望哪些列是唯一的?全部或只有一些? – 2012-04-06 06:37:13

0

好吧,我想我明白你想要什麼了。

對於每個新的a2值,您應該創建11行,並使用與其他同名列(c1)值相同的值來填充(side comment - 這不是用於規範化表和減少存儲的數據量?)。那麼給定a2值的第十二行應該具有t2中指定的b1的唯一值。

創建此方法的一種方法是首先用標準11值填充臨時表。然後使用加條目T2獲得行插入

使用SQL Server語法:

insert into @staticValues (c1, otherCol, b1) 
select c1, otherCol, b1 
from t1 
where a1 = 1305202 -- arbitrary sample existing value 
and c1 <> 3 -- ignoring the varying row 

insert into t1 (a1, c1, otherCol, b1) 
select t2.a2, sv.c1, sv.otherCol, sv.b1 
from @staticValues sv 
    inner join t2 on t2.a2 = t2.a2 -- equivalent to a cross join 
where not exists (select 1 from t1 where t1.a1 = t2.a2) 
union 
select t2.a2, 3, 'audio', t2.b2 
from t2 
where not exists (select 1 from t1 where t1.a1 = t2.a2)