问题描述
请参阅原始问题,然后再进行编码。这是有效的代码:
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;
子句中定义列-然后可以在FROM
,SELECT
或FROM
中的表达式中使用它,就像其他任何列一样。
不能在引入列别名的同一级别上使用列别名。您需要将查询包装在派生表中:
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