我想使用ActiveRecord查询接口编写SQL查询,但我无法猜出ActiveRecord将为该表提供什么别名。这是SQL查询:
SELECT P2.NUM_DOCUMENTO FROM
SCHEMA1.PESSOA_CPBS PC
INNER JOIN SCHEMA2.PESSOA P ON(PC.PESSOA = P.ID_PESSOA)
INNER JOIN SCHEMA2.REPRESENTANTE_LEGAL R ON(R.PESSOA = P.ID_PESSOA)
INNER JOIN SCHEMA2.PESSOA P2 ON(R.REPRESENTANTE_LEGAL = P2.ID_PESSOA)
WHERE PC.INSCRICAO = ?
这是用Ruby编写的相同查询(ActiveRecord):
Pessoa::PessoaCPBS.joins(pessoa: [representantes: :representante])
.select('representante.num_documento')
.where('inscricao = :inscricao', inscricao: ?)
ActiveRecord生成以下SQL:
SELECT
representante.num_documento
FROM
"SCHEMA1"."PESSOA_CPBS"
INNER JOIN "SCHEMA2"."PESSOA" ON "SCHEMA2"."PESSOA"."ID_PESSOA" = "SCHEMA1"."PESSOA_CPBS"."PESSOA"
INNER JOIN "SCHEMA2"."REPRESENTANTE_LEGAL" ON "SCHEMA2"."REPRESENTANTE_LEGAL"."PESSOA" = "SCHEMA2"."PESSOA"."ID_PESSOA"
INNER JOIN "SCHEMA2"."PESSOA" "REPRESENTANTE_GRPFOR_REPRESENT" ON "REPRESENTANTE_GRPFOR_REPRESENT"."ID_PESSOA" = "SCHEMA2"."REPRESENTANTE_LEGAL"."REPRESENTANTE_LEGAL"
WHERE (inscricao = ?)
我收到以下错误:
ActiveRecord::JDBCError: java.sql.SQLSyntaxErrorException: ORA-00904: "REPRESENTANTE"."NUM_DOCUMENTO": invalid identifier
这是我希望ActiveRecord吐出的查询:
SELECT
"REPRESENTANTE_GRPFOR_REPRESENT"."NUM_DOCUMENTO"
FROM
"SCHEMA1"."PESSOA_CPBS"
INNER JOIN "SCHEMA2"."PESSOA" ON "SCHEMA2"."PESSOA"."ID_PESSOA" = "SCHEMA1"."PESSOA_CPBS"."PESSOA"
INNER JOIN "SCHEMA2"."REPRESENTANTE_LEGAL" ON "SCHEMA2"."REPRESENTANTE_LEGAL"."PESSOA" = "SCHEMA2"."PESSOA"."ID_PESSOA"
INNER JOIN "SCHEMA2"."PESSOA" "REPRESENTANTE_GRPFOR_REPRESENT" ON "REPRESENTANTE_GRPFOR_REPRESENT"."ID_PESSOA" = "SCHEMA2"."REPRESENTANTE_LEGAL"."REPRESENTANTE_LEGAL"
WHERE (inscricao = ?)
我怎么能猜到表格的别名????
答案 0 :(得分:1)
您可以更改为:
Pessoa::PessoaCPBS.select('representate_grpfor_represent.num_documento')
.joins(pessoa: [representantes: :representante])
.where('inscricao = ?', "put-your-search-string-here")
在joins
表格中添加select
别名即可:
Pessoa::PessoaCPBS.select('P2.num_documento')
.joins("AS PC INNER JOIN SCHEMA2.PESSOA P ON(PC.PESSOA = P.ID_PESSOA) INNER JOIN SCHEMA2.REPRESENTANTE_LEGAL R ON(R.PESSOA = P.ID_PESSOA) INNER JOIN SCHEMA2.PESSOA P2 ON (R.REPRESENTANTE_LEGAL = P2.ID_PESSOA)")
.where('PC.inscricao = ?', "put-your-search-string-here")
您可以修复必要的内容,因为您的第一个查询和上一个查询不同,尤其是在上一个INNER JOIN
中。
我希望这对你有所帮助。