Skip to content
Advertisement

How to concatenate a query with knextjs

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.

Advertisement