2012-04-06 14 views
1

Ich habe überall gesucht und kann nichts dergleichen finden. Ich habe zwei Tabellen, Tabelle eins t1 hat Einträge für jede a1 Wert, b1 Werte sind statisch für alle a1 mit Ausnahme eines Eintrags. weder a1 noch b1 sind Primärschlüssel. t1 hat auch andere statische Spalten für alle a1.MYSQL mehrere Zeilen INSERT WHERE nicht EXISTS

Tabelle zwei t2 hat a2 und der b2 Wert, der nicht statisch ist. weder a2 noch b2 sind Primärschlüssel (ich verwende unabhängige ID-Spalten für Primärschlüssel).

Mein Ziel ist es, alle a2 Werte zu importieren, die nicht in t1 existieren. Beachten Sie, dass Tabelle 1 derzeit etwa 2 Millionen Einträge enthält und Tabelle 2 im Allgemeinen 150K-1M Einträge enthält.

dies funktioniert:

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) 

aber es tritt nur ein a2 Eintritt in t1, so dass fehlende Einträge.

Das ist meine Idee:

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) 

Ist so etwas möglich? (Dies funktioniert offensichtlich nicht, große Syntaxfehler).

Beispieldaten aus ACTUAL TABELLE:

+---------+------+-------------+-------------+--------------+ 
| 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) 

In meinem Beispiel Tabelle, a1 = destination, b1 = durationRate, c1 = name, d1 = application gibt 12 unterschiedliche Rate von name definiert Decks.

+0

Warum Sie es erwarten 12 Zeilen einfügen von t2 bis t1?Vielleicht wäre es klarer, wenn Sie eine kleine Menge von Beispieldaten von jedem von t1 und t2 zeigen und daher welche Zeilen, die Sie erwarten, in t1 eingefügt werden? – kaj

+0

sicher kein Problem – necival

Antwort

2

Verwenden Sie genauere Bedingungen in where Klausel. Ich habe hier eine andere Spalte hinzugefügt, aber es funktioniert nur ID-Paar a1 und b1 ist einzigartig, wenn es nicht ist, sollten Sie hinzufügen, mehr Spalten zu konditionieren.

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

Also, zuerst sollte ich einen Befehl befüllen t2 mit den anderen 11 Einträge für jede a2? – necival

+0

danke für die schnelle Antwort, BT – necival

+0

@necival, nein, nicht genau. Welche Spalten möchten Sie in der Tabelle t1 eindeutig haben? Alle oder nur einige von ihnen? –

0

Ok, ich glaube ich verstehe, was Sie jetzt wollen.

Sie müssen 11 Zeilen für jeden neuen a2-Wert erstellen, der mit den gleichen Werten gefüllt werden soll, die andere Werte mit derselben Spaltennummer (c1) haben würden (Seitenkommentar - ist dies nicht eine Möglichkeit zur Normalisierung der Tabellen und die Menge der gespeicherten Daten zu reduzieren?). Dann sollte die zwölfte Zeile für einen gegebenen a2-Wert den eindeutigen Wert für b1 haben, wie in t2 spezifiziert.

Eine Möglichkeit, dies zu erstellen, besteht darin, zuerst eine temporäre Tabelle mit den Standard 11-Werten zu füllen. Dann nutzen Sie, dass die Plus die Einträge in t2 die Reihen zu bekommen

Verwenden von SQL Server-Syntax einzufügen:

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) 
Verwandte Themen