Postgresql

跨多個模式查詢,直到執行時才知道

  • November 26, 2019

我有多個需要查詢的模式。這些模式是事先不知道的,例如:

  • U111
  • U222
  • U333

我需要從每個模式中的特定表中選擇這三個模式。我可以將此查詢放在這三個模式中嗎?如果是這樣,我該如何查詢它們?請記住,我不會提前知道模式名稱,因此需要動態建構它們。

如果您只需要來自多個模式的結果,您可以重複使用相同的查詢字元串並search_path在兩者之間設置:

SET search_path = u111, public;
SELECT * FROM foo;
SET search_path = u222, public;
SELECT * FROM foo;
...

Postgres 中的模式搜尋路徑search_path很像文件系統的搜尋路徑。有關的:

如果您需要組合來自多個模式的結果(可能是您的案例),您可以在客戶端中建構語句或使用plpgsql 函式與動態 SQL 和EXECUTE. 這就是我會做的。普通 SQL 不允許參數化標識符(模式、表、列……)。

CREATE OR REPLACE FUNCTION foo(_schemas text[])
 RETURNS TABLE (bar int, baz text) AS  -- matching return type
$func$
BEGIN
  RETURN QUERY EXECUTE (
  SELECT string_agg(format('SELECT bar, baz FROM %I.foo', sch)  -- your query here
                         , E'\nUNION ALL\n')
  FROM   unnest(_schemas) sch
  );
END
$func$  LANGUAGE plpgsql;

動態建構並執行以下形式的查詢:

SELECT bar, baz FROM u111.foo
UNION ALL
SELECT bar, baz FROM u222.foo
UNION ALL
SELECT bar, baz FROM u333.foo;

Schema 名稱被正確地轉義為標識符,以防止 SQL 注入。

db<>fiddle here(返回查詢字元串作為錯誤消息而不是執行它)

舊的sqlfiddle

如果您的表結構相同,您可以使用表繼承,然後創建一個包含所有表結構的主模式,並讓其他表結構從該表結構繼承表:這是我們寫的一篇描述該技術的文章:

http://www.postgresonline.com/journal/archives/59-How-to-Inherit,-Unherit-and-Merge-Inherit.html

引用自:https://dba.stackexchange.com/questions/61525