es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Inner Join en TypeORM misma tabla

Tengo una pregunta a la que no pude encontrar respuesta en línea.

Tengo una tabla única y quiero eliminar entradas duplicadas:

Mi consulta SQL en bruto es:

<h1>Realizar eliminación de registros duplicados con el mismo order_id y message</h1>

DELETE t1 FROM order_logs t1
INNER JOIN order_logs t2
WHERE t1.log_id < t2.log_id
AND t1.order_id = t2.order_id
AND t1.message = t2.message
AND t1.order_id = @ORDER_ID
AND t2.order_id = @ORDER_ID;

Aquí está mi @Entity:

@Entity('customer_logs')
export class CustomerLog {
    @PrimaryGeneratedColumn()
    readonly log_id: number;

    @Column()
    @ManyToOne(() => Customer, (customer) => customer.id, {
        onDelete: 'CASCADE',
    })
    @JoinColumn({ name: 'customer_id' })
    readonly customer_id: number;

    @Column({ default: null, nullable: true })
    @ManyToOne(() => User, (user) => user.user_id)
    @JoinColumn({ name: 'user_id' })
    readonly user_id?: number;

    @Column()
    @IsString()
    @MinLength(1)
    @MaxLength(255)
    readonly message: string;

    @Column()
    @IsEnum(CustomerLogType)
    readonly type: CustomerLogType;

    @Column({ type: 'json', default: null, nullable: true })
    @IsObject()
    readonly json?: object;

    @CreateDateColumn()
    @Expose({ groups: ['ADMIN', 'OWNER'] })
    readonly created_at: Date;

    @UpdateDateColumn()
    @Expose({ groups: ['ADMIN', 'OWNER'] })
    readonly updated_at: Date;

    constructor(partial: Partial<customerlog>) {
        Object.assign(this, partial);
    }
}

¿Sabes cómo puedo realizar esta consulta utilizando TypeORM a través del QueryBuilder?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes realizar la misma consulta utilizando QueryBuilder de TypeORM. Aquí está el código:

    await getConnection()
      .createQueryBuilder()
      .delete()
      .from(CustomerLog, 'cl_1')
      .where(qb => {
        const subQuery = qb.subQuery()
          .select('MIN(cl_2.log_id)')
          .from(CustomerLog, 'cl_2')
          .where('cl_1.order_id = cl_2.order_id')
          .andWhere('cl_1.message = cl_2.message')
          .andWhere('cl_1.order_id = :orderId', { orderId })
          .andWhere('cl_2.order_id = :orderId', { orderId })
          .groupBy('cl_2.order_id, cl_2.message')
          .getQuery();
    
        return 'cl_1.log_id NOT IN ' + subQuery;
      })
      .setParameter('orderId', orderId)
      .execute();
    

    Este código eliminará todas las entradas duplicadas en la tabla customer_logs con el mismo order_id y message, y conservará la que tiene el valor más bajo de log_id. El orderId es el parámetro del decorador @Query que representa el ID del pedido del cual deseas eliminar duplicados.

Comments are closed.