我有一個名為的表relevant_tables,類似于:
schema_name table_name
AAA AA
AAA AB
AAA AC
BBB BA
我遇到了information_schema.columns表格,如果我指定,它將允許我獲取表格的列串列WHERE table_name = 'my_table' AND table_schema = 'my_schema'。
我想在我的表中獲取所有表的所有列relevant_tables,如下面的預期輸出所示:
schema_name table_name column_name
AAA AA A
AAA AA B
AAA AA C
AAA AB A
AAA AC A
BBB BA A
于是我嘗試加入schema_name,table_name如下:
SELECT
c.table_schema,
c.table_name,
column_name
FROM information_schema.columns c
JOIN relevant_tables r
ON c.table_schema = r.schema_name
AND c.table_name = r.table_name
但是,我收到以下錯誤:
[0A000] ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
為什么會出現此錯誤,如何實作預期的輸出?
uj5u.com熱心網友回復:
當計算節點(用于您的聯接)中需要僅領導者資料時,會發生此錯誤。查詢沒有以這種方式進行的路徑。可能有一個計算節點等效表,或者您可以從游標中讀取資訊,例如 -如何在 Redshift 中將系統表或資訊架構表與用戶定義的表連接起來
更新/更多細節:
讓我嘗試澄清一下您可能如何解決此問題。我可以通過 3 種方式查看:
- 找到一個可以訪問計算節點并且包含您需要的資訊的系統表。據我所知,沒有這樣的系統表具有列名。我可能是錯的,因為我沒有搜索所有內容。這將是最簡單的解決方案,但我認為不存在路徑。如果你找到一個,請告訴我。
- 使用系統表資訊創建一個用戶表以在查詢中使用。這就是上面鏈接的答案。有兩種方法可以做到這一點:1)從 Redshift 中讀取系統表資訊(UNLOAD?),然后將其加載回普通表(COPY)或 2)將系統表資訊讀取到游標中,然后讀取游標和將資料放入普通表(鏈接答案中的代碼段)。兩條路徑都不是超快的,帶有復制系統資訊的普通表只會與上次創建時一樣最新。一旦您在普通表中獲得系統表資訊,您就可以在任何和所有查詢中使用它。
- 將資料庫管理查詢從 Redshift 移到其他層(Lambda?)。Redshift 不像其他資料庫那樣設計為一個包羅萬象的操作環境。它旨在對最大的資料集執行最困難的分析查詢。當您處理更復雜的資料庫管理例程(獲取此查詢的結果并應用一些資料庫更改)時,這種方法會有所回報。但這并沒有讓您的查詢在 Redshift 中運行,只是一個更大的圖景。
我建議您考慮#3(長期圖景),但您可能只需要讓它盡快作業。如果有人知道一個系統表,它具有可用于計算節點的列、表和模式名稱,那么很多人都會感興趣,但我不會花很多時間沿著這條路走下去,因為很多人都在你之前。這留下了#2 - 使用您需要的資料創建一個普通表。如果您了解游標(至少了解一點),那么存盤程序就很好,因為您只需要呼叫該程序,系統資料的正常表版本就會重新創建(雖然不是很快)。如果這太多了,那么有一個小 SQL 將系統表資訊卸載到 S3,然后將其加載(復制)回來就可以了 - 只需要 S3 中的一個空間,您可以轉儲檔案。
希望這可以幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/426922.html
