1

我一直在到处寻找,找不到这样的东西。我有两个表,表一个每个值t112 个条目,除一个条目外,所有值都是静态的。既不是主键也不是主键。也有其他所有的静态列。a1b1a1a1b1t1a1

表二t2a2b2值不是静态的。主键也不a2b2(我使用独立的 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 定义了 12 种不同的汇率牌组name

4

2 回答 2

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
)
于 2012-04-06T05:40:54.143 回答
0

好的,我想我现在明白你想要什么了。

您需要为每个新的 a2 值创建 11 行,这些值应该填充与其他同名列 (c1) 值相同的值(旁注 - 这不是标准化表和减少表的机会吗?存储的数据量?)。然后,给定 a2 值的第 12 行应该具有 b1 的唯一值,如 t2 中指定的那样。

创建它的一种方法是首先使用标准 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)
于 2012-04-10T07:57:23.963 回答