2016-07-26 3 views
1

У меня есть 3 стола. Один из них - таблица моих игроков, таблица истории и таблица позиций.Как вставить в две разные таблицы один выбор?

Мне нужно проверить для каждого игрока таблицы игроков, если они уже находятся в таблице истории, если мне не нужно вставлять их в таблицу предыстории и давать затем один элемент в таблице позиций (другая вставка).

У меня уже есть этот код, но я не знаю, как запустить две разные вставки для одного выбора, я искал все время, но, возможно, я должен использовать IF и THEN?

Вот мой запрос:

INSERT INTO tb_item (player_id, friend_id, item_id) 
SELECT 1, id, 101 FROM tb_player 
WHERE vip = 1 
AND creation_date BETWEEN now() - INTERVAL '2 year' AND now() - INTERVAL '1 years' 
AND id NOT IN ( SELECT ig.player_id FROM tb_history ig WHERE ig.item_id = 101 
+0

Я никогда не использовал Postgress, но это звучит как работа для Sto red Процедура – AntDC

+1

Мне сложно понять, что вы хотите. Пожалуйста, отредактируйте свой вопрос и добавьте примерные данные и ожидаемый результат на основе этих данных. _Formatted_ текст, пожалуйста, [скриншоты] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a- вопрос/285557 # 285557). Звучит так, как будто для записи CTE требуется то, что вы ищете: https://www.postgresql.org/docs/current/static/queries-with.html#QUERIES-WITH-MODIFYING –

ответ

0

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

+1

Я предполагаю это нормально, чтобы использовать инструкцию 2 insert, но я не хочу дважды выбирать tb_player для одной и той же вещи, я просто хочу проверить, нужно ли ее вставлять, а затем вставлять в эти две таблицы, разве нет пути? –

+0

Вы можете использовать таблицу temp, но результат в таблице temp, а затем сделать две вставки в 2 таблицы назначения, это рекомендуется, когда SQL медленный или SQL может возвращать разные результаты при вызове во второй раз, в этом случае это 3. –

1

Вы можете вставить с помощью Common Table Expressions как этот

WITH inserted_item AS (
    INSERT INTO tb_item (player_id, friend_id, item_id) 
    SELECT 1, id, 101 FROM tb_player 
    WHERE vip = 1 
    AND creation_date BETWEEN now() - INTERVAL '2 year' 
    AND now() - INTERVAL '1 years' 
    AND id NOT IN (
     SELECT ig.player_id FROM tb_history ig WHERE ig.item_id = 101 
    ) 
    RETURNING * 
) 
INSERT INTO tb_history (some_col1, some_col2, some_col3) 
SELECT player_id, friend_id, item_id 
FROM inserted_item 
Смежные вопросы