INSERT + SELECT: вставка X записей в зависимости от результата IN - PullRequest
0 голосов
/ 24 февраля 2012

Прежде всего, извините за заголовок этой темы, мне не удалось найти другую, более релевантную, поэтому не стесняйтесь изменять ее, если у вас есть идея получше.

В моем случае у меня есть дватаблицы, одна из которых содержит много столбцов, включая один столбец Value, а вторая состоит из трех столбцов:

mysql> describe s_attrib;
+-------------+-------------+------+
| Field       | Type        | Null |
+-------------+-------------+------+
| Login       | varchar(32) | NO   |
| Type        | enum        | NO   |
| Value       | varchar(64) | NO   |
+-------------+-------------+------+
3 rows in set (0.00 sec)

mysql> select * from s_attrib LIMIT 0,4;

+----------+-----------+---------+
|Login     | Type      | Value   |
+----------+-----------+---------+
| login_1  | exception | value_1 |
| login_1  | exception | value_2 |
| login_2  | exception | value_3 |
| login_3  | exception | value_4 |
+--------------------------------+

В этой таблице значение уникально.У входа в систему может быть много значений, но значение не может иметь больше, чем при подключенном входе в систему.

Что я сделал, чтобы получить значения, которые мне нужно вставить для конкретного имени входа в таблицу s_attrib:

mysql> SELECT DISTINCT Value FROM my_table WHERE SOME_BUSINESS_CONDITIONS_HERE;
+---------+
| Value   |
+---------+
| value_5 |
| value_6 |
| value_7 |
| value_8 |
+---------+

Я знаю, что эти значения отсутствуют в моей таблице s_attrib, поэтому при вставке не будет никакого противоречия.

Что я пытаюсь сделать сединственный запрос MySQL состоит в том, чтобы вставить эти значения, такие как:

INSERT INTO s_attrib (Login, type, value) VALUES ('MyLogin', 'except', 'value_5');
INSERT INTO s_attrib (Login, type, value) VALUES ('MyLogin', 'except', 'value_6');
INSERT INTO s_attrib (Login, type, value) VALUES ('MyLogin', 'except', 'value_7');
INSERT INTO s_attrib (Login, type, value) VALUES ('MyLogin', 'except', 'value_8');

Есть ли способ сделать это с помощью одного запроса, используя INSERT INTO ... SELECT?

1 Ответ

1 голос
/ 24 февраля 2012
INSERT INTO s_attrib
SELECT DISTINCT 
   'MyLogin' AS `Login`,
   'exception' AS `Type`,
   Value AS `Value`
FROM my_table 
WHERE SOME_BUSINESS_CONDITIONS_HERE;
...