Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > сделать одним инсертом множественную вставку


Автор: dementiev 20.11.2008, 15:10
Здравствуйте. 

Таблица `human`
+------------------+-----------+
| id_human        | name     |
--------------------+-----------+
|   1                   |   dima     |
|   2                   |  anton    |
|   3                   |  sergei    |
+------------------+------------+

Таблица `mail`
+------------+--------------+-----------------+-------------------+
|    id_mail  |  id_sender |    id_receiver |        topic        |
--------------+---------------+----------------+------------------+  
|        1       |          1       |            2        |        'lalala`    |
|        2       |          3       |            1        |        'ararat'    |
+------------+--------------+-----------------+-------------------+

id_sender и id_receiver - это фк на id_human (т.е. человек может быть как сендэром, так и ресивером).
Задача : отправить письмо с определённым топиком ВСЕМ пользователям.

Это работает, но вставляет одну запись, что и понятно:
Код

insert into mail (id_sender, id_receiver, topic, text, date_of_sending) 
                    SELECT id_sender, id_receiver, topic, text, date_of_sending FROM mail 
                    where topic = `ararat`
                                                                                                 

Каким образом в одном запросе мне перебрать все id_receiver ? 



Автор: destrd 20.11.2008, 15:36
Если не ошибаюсь, то только если формировать INSERT такого вида
insert into table values(), values(..), values(..)

Автор: Zloxa 20.11.2008, 15:57
Цитата(dementiev @  20.11.2008,  15:10 Найти цитируемый пост)
отправить письмо с определённым топиком ВСЕМ пользователям.

Код

insert into mail (id_sender, id_receiver, topic, text, date_of_sending) 
  select :sender id_sender
            , id_human id_receiver
            ,:topic topic
            ,:text text
            ,sysdate date_of_sending
   from human



Добавлено @ 16:06
Или так, если мы хотим переслать ранее сформированное письмо
Код

insert into mail (id_sender, id_receiver, topic, text, date_of_sending) 
  select mail.id_sender
            , id_human id_receiver
            ,mail.topic
            ,mail.text
            ,sysdate date_of_sending
   from human,mail
   where mail.topic = `ararat`
        -- and mail.id_receiver <> human.id_human -- если нам не надо пересылать это писмо повторно тому, кому оно уже доставлнео
       

Автор: dementiev 20.11.2008, 19:22
Zloxa, спасибо. 
То, что надо. Не мог бы мне ещё объяснить, что значит конструкция   "id_human id_receiver"      - это и есть "перебрать" все id_receiver  ? 
Ещё раз, спасибо.

Автор: Zloxa 21.11.2008, 14:18
Цитата(dementiev @  20.11.2008,  19:22 Найти цитируемый пост)
что значит конструкция   "id_human id_receiver"

В данном случае ничего не значит.

Вообще в селект листе это обозначает что в стобец, которому мы присваиваем имя id_receiver, мы наполняем значениями id_human мы назначаем имя стобца id_receiver. (В некоторых диалкетах требуется писать id_human as id_receiver). Но в конструкции insert into ... select это не имеет никакого значения.. я так пишу просто для повышения читаемости.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)