2016-07-26 48 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但是這聽起來像一個申通工作紅色程序 – 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

您不容做到這一點,你必須使用兩個插入statment,其他辦法讓它通過使用觸發器表插入時第一表格將插入到第二臺自動(也是另一插入語句)

+1

我猜使用2插入語句是好的,但我不想爲相同的事情選擇兩次tb_player,我只是想檢查它是否應該插入然後插入這兩個表中,是不是有一種方法? –

+0

您可以使用臨時表來對臨時表執行結果,然後對兩個目標表執行兩次插入,這在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 
相關問題