'How to translate an raw SQL query to TypeORM query builder?

How would I convert the subQuery select with distinct to TypeORM querybuilder? Thanks.

SELECT `time`, (case when `start` is NULL then 0 else 1 end) `is_reserved` FROM a left join (SELECT `time` FROM b join c on c.b_id = b.id WHERE b.date = '2022-04-20') MySchedule on MySchedule.time = a.time where a.is_use = 1

a table
time
is_use 

b table
id
date

c table
b_id
time


Solution 1:[1]

You can first build the nested query and then left-join it to the main query:

import { getConnection } from 'typeorm';

// build the nested query
const nestedQuery = getConnection()
  .createQueryBuilder(B, 'b').select('time')
  .innerJoin(C, 'c.b_id = b.id')
  .where(`b.date = '2022-04-20'`);

getConnection().createQueryBuilder(A, 'a')
  .select([
    'time',
  ])
  .addSelect('(case when `start` is NULL then 0 else 1 end)', 'is_reserved')

  // left join the nested query
  .leftJoin(
    `(${nestedQuery.getQuery()})`,
    'MySchedule',
    'MySchedule.time = a.time')
  .where('a.is_use = 1')
  .getMany();

Where A, B and C are TypeORM entities.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alexander Reznikov