25. 25
Firebirdでサポート: MERGE文
MERGE INTO shain U
USING m_shain N
ON (U.ID = N.ID)
WHEN MATCHED THEN
UPDATE SET u.name = n.name
WHEN NOT MATCHED THEN
INSERT (U.ID, U.NAME)
VALUES(N.ID, N.NAME)
27. 27
MySQLの場合
• (1) INSERT … ON DUPLICATE KEY
UPDATE構文
– INSERT INTO shain(id, name) select id, name
FROM m_shain ON DUPLICATE KEY
UPDATE name = m_shain.name;
• (2) REPLACE構文
– REPLACE INTO shain(id, name) select id,
name FROM m_shain;
28. 28
PostgreSQLの場合
• PostgreSQL 9.5からサポート
• INSERT INTO shain(id, name) select id,
name FROM m_shain ON CONFLICT ON
CONSTRAINT 制約名 DO UPDATE set
name = EXCLUDED.name;
• MySQLと違って制約名が必要。
• 表名(m_shain)修飾ではなく、EXCLUDED
• PostgreSQL9.5より前ではCTE(PostgreSQl
9.1からサポート)もしくはトリガで。。。
30. 30
MERGE文の例
MERGE INTO shain U ¥
USING m_shain N ¥
ON (U.ID = N.ID) ¥
WHEN MATCHED THEN ¥
UPDATE SET u.name = n.name ¥
WHEN NOT MATCHED THEN ¥
INSERT (U.ID, U.NAME)
VALUES(N.ID, N.NAME)
31. 31
MySQLの場合
• INSERT IGNOREを使う。
• INSERT IGNORE shain(id, name) select
id, name FROM m_shain;
• すごーく古いMySQLではINSERTのデフォル
ト動作がIGNORE(!)だったが、最新の
MySQLでは明示的に指定する必要有り。
32. 32
PostgreSQLの場合
• これも9.5以降
• “DO アクション”でアクションにNOTHING
• INSERT INTO shain(id, name) select id,
name FROM m_shain ON CONFLICT ON
CONSTRAINT 制約名 DO NOTHING;
39. 39
再帰クエリ
• 例) きむら自身と直接・間接の部下を求める。
SQL> WITH RECURSIVE n AS
CON> (SELECT empid, name
CON> FROM shain
CON> WHERE name = 'きむら'
CON> UNION ALL
CON> SELECT nnext.empid, nnext.name
CON> FROM shain as nnext, n
CON> WHERE n.empid = nnext.mgrid)
CON> SELECT name FROM n;
NAME
====================
きむら
加藤
林
三浦