Im trying to archive this SQL to Knext but i dont know how to do it
THIS IS THE ORIGINAL QUERY and is fully functional in postgresql using the console
select permiso.patente, categoria.nombre,permiso.fecha_caducidad,DATE_PART('day', permiso.fecha_caducidad:: TIMESTAMP - now():: TIMESTAMP) from categoria inner join permiso on permiso.idcategoria = categoria.idcategoria and permiso.patente in ( select equipo.patente from equipo inner join empresa on equipo.rutempresa = empresa.rutempresa where empresa.rutempresa = 84123456 )
THIS IS HOW IM TRYING TO ARCHIVE with knextjs
const test2 = db.select(['permiso.patente' ,'categoria.nombre' ,'permiso.fecha_caducidad']) /*,('DATE_PART("day",permiso.fecha_caducidad::TIMESTAMP - now()::TIMESTAMP')])*/ .from('permiso') .innerJoin('categoria','categoria.idcategoria','permiso.idcategoria') .whereIn( db.select('equipo.patente') .from('equipo') .innerJoin('empresa','equipo.rutempresa','empresa.rutempresa') .where('empresa.rutempresa',84123456) ) .then(data => console.log(data)) .catch(error => console.log(error))
Expected result:
-"PKYJ03" "Revision Tecnica" "2021-11-26 00:00:00" "784" -"PKYJ03" "Certificado Seguridad" "2021-11-26 00:00:00" "784" -"PKYJ03" "Certificado Seguridad" "2019-08-24 00:00:00" "-40" -"PKYJ03" "Certificado Seguridad" "2019-08-25 00:00:00" "-39" -"PKYJ03" "Revision Tecnica" "2019-09-26 00:00:00" "-7"
Get:
Error: Undefined binding(s) detected when compiling SELECT. Undefined column(s): [select "equipo"."patente" from "equipo" inner join "empresa" on "equipo"."rutempresa" = "empresa"."rutempresa" where "empresa"."rutempresa" = 84123456] query: select "permiso"."patente", "categoria"."nombre", "permiso"."fecha_caducidad" from "permiso" inner join "categoria" on "categoria"."idcategoria" = "permiso"."idcategoria" where select "equipo"."patente" from "equipo" inner join "empresa" on "equipo"."rutempresa" = "empresa"."rutempresa" where "empresa"."rutempresa" = ? in ?
Advertisement
Answer
Ok. this is the final and correct answer using the same subquery; thanks to Mikael for the amazing help.
Original SQL:
select permiso.patente, categoria.nombre,permiso.fecha_caducidad,DATE_PART('day', permiso.fecha_caducidad:: TIMESTAMP - now():: TIMESTAMP) from categoria inner join permiso on permiso.idcategoria = categoria.idcategoria and permiso.patente in ( select equipo.patente from equipo inner join empresa on equipo.rutempresa = empresa.rutempresa where empresa.rutempresa = 84123456 )
Knex style query:
Subquery:
const subquery = db.select('equipo.patente') .from('equipo') .innerJoin('empresa','equipo.rutempresa','empresa.rutempresa') .where('empresa.rutempresa',84123456)
Main query:
const test3 = db.select(['permiso.patente' ,'categoria.nombre' ,'permiso.fecha_caducidad' ,db.raw("DATE_PART('day',permiso.fecha_caducidad::TIMESTAMP - now()::TIMESTAMP)")]) .from('permiso') .innerJoin('categoria','categoria.idcategoria','permiso.idcategoria') .whereIn('permiso.patente', subquery) .then(data => console.log(data)) .catch(error => console.log(error))
Expected and Given result:
"PKYJ03" "Revision Tecnica" "2021-11-26 00:00:00" "782" "PKYJ03" "Certificado Seguridad" "2021-11-26 00:00:00" "782" "PKYJ03" "Certificado Seguridad" "2019-08-24 00:00:00" "-42" "PKYJ03" "Certificado Seguridad" "2019-08-25 00:00:00" "-41" "PKYJ03" "Revision Tecnica" "2019-09-26 00:00:00" "-9"
And like Mikael says, there’s a little difference between the original query and this one, but for the database result is the same.