2015-04-12 110 views
1

我有以下SQL語句SQL INSERT當兩個SELECT查詢返回一個非空值

INSERT INTO combats (combat_killer, combat_victim, combat_weapon, combat_time, combat_server) 
VALUES(
    (SELECT player_id FROM players WHERE player_username = 'Kvazos'), 
    (SELECT player_id FROM players WHERE player_username = 'paulaagee'), 
    'Diamond Sword', 
    CURRENT_TIMESTAMP, 
    1 
); 

這將基本上得到的另外兩個記錄的ID,並將其插入到表中。但是,可能存在發送的player_username不存在並且SELECT將返回NULL的情況。 如果兩個SELECT中的一個返回NULL,我該如何防止執行此INSERT?

+0

@BenjaminGruenbaum粗體的最後一句指定OP要阻止執行插入。 –

+0

如果查詢失敗,查詢就會給我一個例外。但是這裏的重點不是必須要拋出異常,而是如果不需要插入就簡單地標記爲查詢成功。 @ Jean-FrançoisSavard解決了這個問題。多謝你們! –

回答

1

我相信這是你想要的

INSERT INTO combats (combat_killer, combat_victim, combat_weapon, combat_time, combat_server) 
SELECT a.player_id, b.player_id, 'Diamond Sword', CURRENT_TIMESTAMP, 1 
FROM (SELECT player_id from players where player_username = 'Kvazos') a 
JOIN (SELECT player_id from players where player_username = 'paulaagee') b 
WHERE a.player_id is not null 
    AND b.player_id is not null; 

編輯:CURRENT_TIMESTAMP

+0

這正是我需要的,謝謝!我會盡可能標記爲已接受的答案。 注意:您錯過了current_timestamp後的combat_server值 –

0

之後添加1您可以更簡單地表達這個查詢爲:

INSERT INTO combats(combat_killer, combat_victim, combat_weapon, combat_time, combat_server) 
    SELECT a.player_id, b.player_id, 'Diamond Sword', CURRENT_TIMESTAMP, 1 
    FROM (SELECT player_id from players where player_username = 'Kvazos') a CROSS JOIN 
     (SELECT player_id from players where player_username = 'paulaagee') b; 

既不是where也不on條款是必要的。如果任一查詢沒有匹配,則不返回任何行。