[英]Convert MySQL query into PostgreSQL
我有這個查詢:
DROP TABLE IF EXISTS tmp_table;
CREATE TEMPORARY TABLE tmp_table(id int primary key)
IGNORE (
SELECT user2role.userid AS userid
FROM user2role
INNER JOIN users ON users.id=user2role.userid
INNER JOIN role ON role.roleid=user2role.roleid
WHERE role.parentrole like 'H1::H2::H3::H4::H5::%')
UNION (
SELECT groupid
FROM groups
WHERE groupid IN (2,3,4));
該查詢最初是用MySQL編寫的,它使用IF NOT EXISTS
代替了DROP TABLE IF EXISTS
IF NOT EXISTS
。 我更改了那部分,但是我不知道該如何處理IGNORE
。
首先, IGNORE
在做什么?
我嘗試尋找PostgreSQL等效項,但它們似乎都涉及復雜的過程。 我是否需要為此編寫程序? 如果我必須寫一個,那會是什么樣? 我可以使用一些PHP代碼代替IGNORE
嗎? (SQL查詢由PHP生成。)
您將在postgres中這樣寫。
IGNORE
在這里無關緊要,因為該表剛剛被重新創建並且保證為空。 而且UNION
保證不會插入重復的行。
DROP TABLE IF EXISTS tmp_table;
CREATE TEMP TABLE tmp_table(id int4 primary key);
INSERT INTO tmp_table
SELECT user2role.userid::int4 AS id
FROM user2role
JOIN users ON users.id = user2role.userid
JOIN role ON role.roleid = user2role.roleid
WHERE role.parentrole like 'H1::H2::H3::H4::H5::%'
UNION
SELECT groupid::int4
FROM groups
WHERE groupid in (2,3,4);
如果不能在SELECT中發生重復,則可以考慮使用更快的UNION ALL
而不是UNION
。 否則,您需要UNION
消除可能的重復。 在這里閱讀。
如果數據集很大,則可以考慮在INSERT 之后創建主鍵。 那就快了。
閱讀有關IGNORE
效果的mySQL文檔 。
在重新訪問頁面時,我意識到您在原始代碼中提到了IF NOT EXISTS
。 您不必這么說,但這僅在原始代碼僅在表不存在時才創建表的情況下才有意義,這會導致在INSERT之前表不為空的可能性。 在這種情況下, IGNORE
是相關的,並且需要與PostgreSQL中的等效項。
因此,這是對該問題的解釋的替代答案 。
CREATE TEMP TABLE IF NOT EXISTS
PostgreSQL 9.1中已實現,則 CREATE TEMP TABLE IF NOT EXISTS
。
對於較舊的版本,我最近在SO上發布了一個解決方案 。
CREATE TEMP TABLE IF NOT EXISTS tmp_table(id int4 primary key);
INSERT INTO tmp_table
SELECT x.id
FROM (
SELECT user2role.userid::int4 AS id
FROM user2role
JOIN users ON users.id = user2role.userid
JOIN role ON role.roleid = user2role.roleid
WHERE role.parentrole like 'H1::H2::H3::H4::H5::%'
UNION
SELECT groupid::int4
FROM groups
WHERE groupid in (2,3,4)
) x
LEFT JOIN tmp_table t USING (id)
WHERE t.id IS NULL;
LEFT JOIN ... WHERE t.id IS NULL
不包括tmp_table
中可能已經存在的任何id
。 UNION
進入子選擇,因此該子句只需要應用一次。 應該最快。
有關LEFT JOIN的更多信息,請點擊這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.