0

元の質問とコードを参照してください。動作するコードは次のとおりです。

SELECT v1.s_owner_guid,
       n.node_name as s_owner_name
FROM vm_list v 
    CROSS JOIN LATERAL (
     SELECT (VALUES (TRIM(split_part(v2.set_of_guids, ':', 3), '|')))
     ) v1(s_owner_guid)
     LEFT JOIN nodes n
     ON n.id = v1.s_owner_guid::uuid

動作しない元のコード:

SELECT 
    (TRIM (split_part(v2.set_of_guids, ':', 3)), '|') AS s_owner_guid
        , n1.node_name as s_owner_name
    FROM vm_list as v2
    INNER JOIN nodes 
        AS n1
        ON n1.id=s_owner_guid
   

この SELECT から s_owner_guid と s_owner_name を取得したい

これは私が問題を抱えているクエリの一部であり、ネストされた SELECT です

The error I get is:
ERROR:  column "s_owner_guid" does not exist
LINE 7:   ON v2.owner=s_owner_guid

特定の文字で区切られた2つのノードuidを含むset_of_guidsがあります

必要な情報を含む2つのテーブルがあります

  • vm_listノードは2つのテーブルです
  • vm_owner_guidノード テーブルの id 列に一致する uid を持つ vm_list テーブルの列です。
  • idノードテーブルの列です
  • vm_nameVM 名を含む vm_list の列です。
  • node_nameノード テーブルの id 列に関連付けられているノードの列です。
  • set_of_guids の最初の uid は vm_owner と一致し、ノード テーブルの id 列にも一致し、ノードの別の列に node_name があります

VM の 2 番目の uid を取得するには set_of_nodes を解析する必要があるため、SPLIT_PART および TRIM オプションを使用して uid を分離し、それを s_owner_guid と呼んでいます。

2 番目の node_name を取得するには、s_owner_guid を取り、それをノード テーブルの ID と照合する必要があります

最終的に、出力は次のようになります。

vm_name      |   p_owner_guid                        |   p_owner_name    |   s_owner_guid                        |   s_owner_name
-------------+---------------------------------------+-------------------+---------------------------------------+-----------------------
 NAMEOFVM1   |  b2a0bb4e-0a6a-4208-8ff1-6df549cf9c3f | primary_node_name | 1c732242-56d4-c9c8-d275-ba271600c314  |  secondary_node_name

最初の 4 つのフィールドは取得できますが、最後の s_owner_name は取得できません。これを達成する方法はありますか?DBに依存するライブシステムがあるため、一時テーブルを作成しないようにしています。

4

2 に答える 2

1

Postgres はラテラル ジョインをサポートしています。これは、これを実現する優れた方法です。

SELECT v.s_owner_guid,
       n.node_name as s_owner_name
FROM vm_list v2 CROSS JOIN LATERAL
     (VALUES (TRIM(split_part(v2.set_of_guids, ':', 3), '|')))
     ) v(s_owner_guid)
     nodes n
     ON n.id = v.s_owner_guid;

ラテラル結合を使用すると、FROM句で列を定義できます。その後、他の列と同様に、、、SELECTまたはFROMの式で使用できます。WHERE

于 2020-08-22T12:07:35.120 に答える