25
Firebirdでサポート: MERGE文
MERGE INTOshain 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
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
MERGE文の例
MERGE INTO shainU ¥
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
再帰クエリ
• 例) きむら自身と直接・間接の部下を求める。
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
====================
きむら
加藤
林
三浦