簡體   English   中英

將MySQL查詢轉換為PostgreSQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM