【问题标题】:SQL Server/ TypeORM - multiple joins. How should I format the query?SQL Server/ TypeORM - 多个连接。我应该如何格式化查询?
【发布时间】:2021-02-20 08:11:02
【问题描述】:

我是 typeorm 的新手,也许有人可以解决我的问题。 我有这个查询,需要将其格式化为 TypeORM :

SELECT DISTINCT 
  Municipios.Descricao AS Cidade
  ,Municipios.Estado
  ,Municipios.CodigoMunicipio
  ,EmpresaUnidades.CNPJ
  ,Empresa.MaximoHorasExtras
  ,EmpresaUnidades.CodigoEmpresa
  ,UnidadesCidadeAtendimento.ValorTaxaEntrega
  ,UnidadesCidadeAtendimento.ValorTaxaDevolucao
  ,UnidadesCidadeAtendimento.PercTaxaAdministrativa
  ,UnidadesCidadeAtendimento.SobConsulta
  ,UnidadesCidadeAtendimento.CodigoTipoDiversoTaxaEntrega
  ,UnidadesCidadeAtendimento.CodigoTipoDiversoTaxaDevolucao
  ,EmpresaUnidades.CodigoMunicipio AS CodigoMunicipioEmpresa
  FROM UnidadesCidadeAtendimento
  INNER JOIN Municipios ON UnidadesCidadeAtendimento.CodigoMunicipio = Municipios.CodigoMunicipio
  INNER JOIN EmpresaUnidades ON UnidadesCidadeAtendimento.CodigoUnidade = EmpresaUnidades.CodigoUnidade
        AND UnidadesCidadeAtendimento.CodigoEmpresa = EmpresaUnidades.CodigoEmpresa
  INNER JOIN Empresa ON EmpresaUnidades.CodigoEmpresa = Empresa.CodigoEmpresa
  WHERE (EmpresaUnidades.Ativa = 'S')
  AND (UnidadesCidadeAtendimento.Ativa = 'S')
  AND (EmpresaUnidades.ExibirUnidadeAppReserva = 'S')
ORDER BY Municipios.Descricao

这是我的尝试:

await this.createQueryBuilder('UnidadesCidadeAtendimento')
  .addSelect('Municipios.Descricao AS Cidade')
  .addSelect('Municipios.Estado')
  .addSelect('Municipios.CodigoMunicipio')
  .addSelect('EmpresaUnidades.CNPJ')
  .addSelect('Empresa.MaximoHorasExtras')
  .addSelect('EmpresaUnidades.CodigoEmpresa')
  .addSelect('UnidadesCidadeAtendimento.ValorTaxaEntrega')
  .addSelect('UnidadesCidadeAtendimento.ValorTaxaDevolucao')
  .addSelect('UnidadesCidadeAtendimento.PercTaxaAdministrativa')
  .addSelect('UnidadesCidadeAtendimento.SobConsulta')
  .addSelect('UnidadesCidadeAtendimento.CodigoTipoDiversoTaxaEntrega')
  .addSelect('UnidadesCidadeAtendimento.CodigoTipoDiversoTaxaDevolucao')
  .addSelect('EmpresaUnidades.CodigoMunicipio AS CodigoMunicipioEmpresa')
  .innerJoin('Municipios', 'UnidadesCidadeAtendimento.CodigoMunicipio = Municipios.CodigoMunicipio')
  .innerJoin('EmpresaUnidades', 'UnidadesCidadeAtendimento.CodigoUnidade = EmpresaUnidades.CodigoUnidade')
  .innerJoin('EmpresaUnidades', 'UnidadesCidadeAtendimento.CodigoEmpresa = EmpresaUnidades.CodigoEmpresa')
  .innerJoin('Empresa', 'EmpresaUnidades.CodigoEmpresa = Empresa.CodigoEmpresa')
  .where('EmpresaUnidades.Ativa = S')
  .distinct(true)
  .orderBy('Municipios.Estado', 'ASC')
  .getMany();

我收到以下回复: "error": "错误:关键字 'WHERE' 附近的语法不正确。"

但我找不到语法错误。

谁能帮帮我?

【问题讨论】:

  • 从你的问题中不清楚,“this”是什么。
  • 我认为问题出在此处:.where('EmpresaUnidades.Ativa = S')。您必须使用 'S' 而不是 S'

标签: node.js sql-server typeorm


【解决方案1】:

打开 TypeOrm 完整日志记录,这样您就可以看到实际生成的 SQL,并且您将快速解决此类问题。见TypeOrm logging

如果您不将相关表声明为实体,则需要使用innerJoin() 函数的三参数形式,即.innerJoin(table, tableAlias, condition);使表别名与表名相同,您的内部联接如下所示:

.innerJoin('Municipios',      'Municipios',      'UnidadesCidadeAtendimento.CodigoMunicipio = Municipios.CodigoMunicipio')
.innerJoin('EmpresaUnidades', 'EmpresaUnidades', 'UnidadesCidadeAtendimento.CodigoUnidade = EmpresaUnidades.CodigoUnidade')
.innerJoin('EmpresaUnidades', 'EmpresaUnidades', 'UnidadesCidadeAtendimento.CodigoEmpresa = EmpresaUnidades.CodigoEmpresa')
.innerJoin('Empresa',         'Empresa',         'EmpresaUnidades.CodigoEmpresa = Empresa.CodigoEmpresa')

另外,您错过了 Where 值的引号。您需要将文字括在单引号中,或对其进行参数化。如果您使用的是单引号文字,则 where 表达式需要用双引号括起来:

.where("EmpresaUnidades.Ativa = 'S'")

或者将其设为参数化字符串(您可以使用单引号,因为您没有使用 SQL Server 文字字符串):

.where('EmpresaUnidades.Ativa = :WhereAtiva', { WhereAtiva: 'S'})

或者将其设为参数化值:

var whereAtiva = 'S';

// the query ...

.where('EmpresaUnidades.Ativa = :WhereAtiva', { WhereAtiva: whereAtiva})

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多