如何将单个选择插入到两个不同的表中?

问题描述:

我有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但是这听起来像一个申通工作红色程序 – 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 –

您不容做到这一点,你必须使用两个插入statment,其他办法让它通过使用触发器表插入时第一表格将插入到第二台自动(也是另一插入语句)

+1

我猜使用2插入语句是好的,但我不想为相同的事情选择两次tb_player,我只是想检查它是否应该插入然后插入这两个表中,是不是有一种方法? –

+0

您可以使用临时表来对临时表执行结果,然后对两个目标表执行两次插入,这在SQL慢时建议使用,或者在第二次调用时SQL可以返回不同结果,在这种情况下, 3插入语句。 –

可以插入使用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