如何将TRIM的结果与JOIN

问题描述

请参阅原始问题,然后再进行编码。这是有效的代码

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

我有一个set_of_guids,其中包含2个节点uid(由某些字符分隔)

我有2张桌子,上面有我需要的信息

  • vm_list和节点是2个表
  • vm_owner_guid是vm_list表中的一列,在节点表中具有uid匹配的id列
  • id是节点表中的一列
  • vm_name是vm_list中具有VM名称的列
  • node_name是节点中的一列,与节点表中的id列相关联
  • set_of_guids中的第一个uid与vm_owner以及节点表中的id列匹配,并且在节点中的另一列中具有node_name

我需要解析set_of_nodes以获得VM的第二个uid,因此我使用SPLIT_PART和TRIM选项来隔离uid,并将其称为s_owner_guid

我需要使用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。有什么办法可以做到这一点?由于数据库具有实时系统,因此我试图不创建临时表。

解决方法

Postgres支持横向连接,这是完成此操作的好方法:

router.get('/setup-vault',async function (req,res,next) {
        let pass = req.body.password;
        let confirmPass = req.body.passwordConfirm;

        if(pass === undefined || pass === "" ||
            confirmPass === undefined || confirmPass === "") {
            res.json({status: false,message: "Password(s) cannot be empty"});
        }

        if(pass !== confirmPass) {
            res.json({status: false,message: "Keys don't match"});
        } else {
            const vaultHash = vault.encrypt(pass,Buffer.from(settingName.vaultSecret));
            await createOrSaveSetting(settingName.vaultSecret,vaultHash);
            // test connection
            res.json({status: true,message: "Vault created"});
        }
    });

横向联接允许您在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; 子句中定义列-然后可以在FROMSELECTFROM中的表达式中使用它,就像其他任何列一样。

,

不能在引入列别名的同一级别上使用列别名。您需要将查询包装在派生表中:

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