我到处寻找,找不到这样的东西。我有两个表,第一个表t1
为每个a1
值包含 12 条目,b1
值对于除{1}}之外的所有a1
都是静态的。 a1
或b1
都不是主键。 t1
还有所有a1
的其他静态列。
表格二t2
有a2
,b2
值不是静态的。 a2
和b2
都不是主键(我使用主键的独立id列)。
我的目标是导入a2
中不存在的所有t1
值。请记住,表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
条目,而 11 会丢失条目。
这是我的想法:
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 )
这样的事情可能吗? (这显然不起作用,主要的语法错误)。
来自实际表的示例数据:
+---------+------+-------------+-------------+--------------+
| 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
= destination
,b1
= durationRate
,c1
= name
,d1
= application
name
定义了12种不同的费率套牌。
答案 0 :(得分:2)
在where
子句中使用更具体的条件。我在这里添加了另一个专栏,但它只能使用ID对a1
和b1
是唯一的,如果不是你应该添加更多列来调整。
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
)
答案 1 :(得分:0)
好的,我想我明白你现在想要什么。
您要为每个新的a2值创建11行,这些值应使用与其他同名列(c1)值相同的值填充(旁注释 - 这不是规范化表的机会)并减少存储的数据量?)。那么给定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)