вставка записей в таблицу MySQL в зависимости от существующих значений в другой таблице - PullRequest
0 голосов
/ 06 апреля 2009

Я использую MySQL. Я хочу вставить некоторые записи в таблицу при условии, что они не существуют в другой таблице. Поэтому я хочу выполнить что-то вроде этого:

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

Проблема в том, что MySQL не допускает такой синтаксис (что-то связанное с предложением where ...) Я пытался использовать CONCAT, но безрезультатно.

Любая подсказка ??

Ответы [ 7 ]

1 голос
/ 06 апреля 2009

MySQL позволяет использовать кортеж как переменную:

Это ваше заявление:

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

Проблема в «имя и идентификатор». Преврати это в кортеж:

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

Лично мне это не очень нравится по двум причинам: кортеж как переменная не работает (или работает по-другому) на других RDBMS, а IN имеет тенденцию работать плохо во многих ситуациях, поэтому мне нравится делать это привычка не использовать ВО.

Как заявляет jhonny-d-cano-leftware (я модифицировал его), я бы использовал где не существует:

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);
1 голос
/ 06 апреля 2009

Вы пробовали синтаксис EXISTS ?

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 голос
/ 06 апреля 2009
INSERT
INTO    sales (name, id)
SELECT  name, id
FROM    sales_h
WHERE  (name, id) NOT IN
       (
       SELECT name, id
       FROM t_sales
       )
0 голосов
/ 03 августа 2009
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
)
0 голосов
/ 06 апреля 2009

Проблема в вашем ГДЕ.

Это не чтение, как вы. Вы читаете его как «ГДЕ (имя и идентификатор) НЕ ВХОДИТ (...)», тогда как вы читаете его как «ГДЕ имя (не нулевое) И (идентификатор НЕ ВХОДИТ (...))» .. ... если вы понимаете, о чем я.

Изменить на это: ROW(name, id) NOT IN (SELECT name, id FROM T_sales);

0 голосов
/ 06 апреля 2009

Вы не можете сказать, ГДЕ ИМЯ И ИД НЕ ВХОДИТ ... вам нужно отдельное предложение для каждого. Но есть ли у вас идентификатор в качестве первичного ключа в таблице T_sales? Если это так, то это все, что вам нужно проверить, SP что-то вроде:

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

EDIT

Хм из ответов других людей, может быть лучше игнорировать меня, поскольку они, кажется, знают больше: -)

0 голосов
/ 06 апреля 2009

Вы можете посмотреть в предложение ON DUPLICATE для MySql

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

...