2009-04-06 8 views
0

J'utilise MySQL. Je veux insérer des enregistrements dans une table à condition qu'ils ne figurent pas dans une autre table. Donc, je veux faire quelque chose comme ceci:Insérer des enregistrements dans une table MySQL en fonction des valeurs existantes dans une autre table

INSERT INTO sales (name, id) 
SELECT name, id FROM sales_h 
WHERE name AND id NOT IN (SELECT name, id FROM T_sales); 

Le problème est que MySQL ne permet pas ce genre de syntaxe (quelque chose à voir avec la clause where ...) J'ai essayé d'utiliser CONCAT mais sans résultat.

Un indice?

Répondre

0

Vous ne pouvez pas dire où le nom et l'ID NOT IN ... vous avez besoin d'une clause distincte pour chacun. Mais avez-vous id comme clé primaire dans la table T_sales? Si oui, alors c'est tout ce que vous devez vérifier, sp quelque chose comme:

INSERT INTO sales (name, id) 
(SELECT name, id FROM sales_h WHERE id NOT IN (SELECT id FROM T_sales)); 

EDIT

Hmmm à partir des réponses des autres, il pourrait être préférable de me ignorer comme ils semblent savoir plus :-)

1
INSERT 
INTO sales (name, id) 
SELECT name, id 
FROM sales_h 
WHERE (name, id) NOT IN 
     (
     SELECT name, id 
     FROM t_sales 
     ) 
0

Le problème est votre O WH.

Il ne lit pas comme vous êtes. Vous le lisez comme "WHERE (name and id) NOT IN (...)", alors qu'il le lit comme "WHERE name (n'est pas nul) AND (id not IN (...))" .. si tu comprends ce que je veux dire.

Changement à ceci: ROW(name, id) NOT IN (SELECT name, id FROM T_sales);

1

Avez-vous essayé le EXISTEsyntax?

INSERT INTO sales (name, id) 
SELECT name, id 
FROM sales_h 
WHERE NOT EXISTS (SELECT * FROM T_sales WHERE T_sales.name = sales_h.name AND T_sales.id = sales_h.id); 
1

MySQL vous permet d'utiliser un tuple comme une variable:

Ceci est votre déclaration:

INSERT INTO sales (name, id) 
SELECT name, id FROM sales_h 
WHERE name AND id NOT IN (SELECT name, id FROM T_sales); 

Le problème est "le nom et l'identification". Transformer en un tuple:

INSERT INTO sales (name, id) 
SELECT name, id FROM sales_h 
WHERE (name, id) NOT IN (SELECT name, id FROM T_sales); 

Personnellement, je n'aime pas beaucoup pour deux raisons: le tuple comme variable ne fonctionne pas (ou fonctionne différemment) sur d'autres SGBDR, et IN tend à mal à réaliser beaucoup de situations, donc j'aime prendre l'habitude de ne pas utiliser IN.

Comme les États jhonny-d-cano-leftware (je l'ai upmodded), j'utiliser un où existe pas:

INSERT INTO sales (name, id) 
SELECT name, id FROM sales_h a 
WHERE not exists (
SELECT * 
FROM T_sales b 
where b.id = a.id and b.name = a.name); 
0
INSERT INTO table_name(column1, column2) SELECT "value one", "value two" FROM DUAL 
WHERE NOT EXISTS(
    SELECT column1 FROM table_name 
    WHERE column1 = "value one" 
    AND column2 = "value two" LIMIT 1 
) 
Questions connexes