gpt4 book ai didi

sql - TypeORM 子查询

转载 作者:行者123 更新时间:2023-12-03 16:53:29 26 4
gpt4 key购买 nike

基于类型ORM docs关于使用子查询,解释了如何创建子查询。
示例:

const qb = await getRepository(Post).createQueryBuilder("post");
const posts = qb
.where("post.title IN " + qb.subQuery().select("user.name").from(User, "user").where("user.registered = :registered").getQuery())
.setParameter("registered", true)
.getMany();

但是对于 SQL 是什么,没有等价物。

假设我有包含如下子查询的查询:
SELECT a, TO_CHAR (MAX (jointable.f), 'MON YYYY') as f,
t3.c, t3.d, t1.e
FROM table1 t1
LEFT JOIN table2 t2 ON t2.e = t1.e
JOIN table3 t3 ON t3.d = t2.d
JOIN
(SELECT f, t4.g, t5.e, t6.h
FROM table4 t4
JOIN table5 t5 ON t4.g = t5.g
JOIN table6 t6 ON t6.g = t4.g
AND (t6.i = 2
OR (t6.i = 1 AND j = 1)
)
WHERE t4.k = 4
) jointable ON t1.e = jointable.e
WHERE jointable.h = :h
AND(:d = 3 OR
t3."d" = :d
)
GROUP BY a, t3.c, t3.d, t1.e
ORDER BY a ASC

对于上面的 SQL 查询,我应该如何使用 typeORM 查询构建器函数?

假设我已经创建了与上面查询中使用的所有表相关的实体。

最佳答案

我希望这个答案可以帮助其他人使用 TypeORM 子查询。

const subquery = await getManager()
.createQueryBuilder(table4, 't4')
.select('"t4".f')
.addSelect('"t4".g')
.addSelect('"t5".e')
.addSelect('"t6".h')
.innerJoin(table5, 't5', '"t4".g = "t5".g')
.innerJoin(table6, 't6', '"t6".g = "t4".g')
.where('"t4".k = 4 AND ("t6".i = 2 OR ("t6".i = 1 AND "t6".j = 1))');

model = await getManager()
.createQueryBuilder(table1, 't1')
.select('"t1".a')
.addSelect("TO_CHAR (MAX (jointable.f), 'MON YYYY')", 'f')
.addSelect('"t3".c')
.addSelect('"t3".d')
.addSelect('"t1".e')
.leftJoin('table2', 't2', '"t2".e = "t1".e')
.innerJoin(table3, 't3', '"t3".d = "t2".d')
.innerJoin('('+subquery.getQuery()+')', 'jointable', '"t1".e = jointable.e')
.where('jointable.h = :h AND (:d = 3 OR "t3".d = :d)',
{ h: h, d: d })
.groupBy('"t1".a, "t3".c, "t3".d, "t1".e')
.orderBy('"t1".a', 'ASC')
.getRawMany();
我正在使用 '('+subquery.getQuery()+')'用于获取子查询选择查询作为等效于

(SELECT f, t4.g, t5.e, t6.h ....

......

.... ) jointable ON t1.e = jointable.e


根据我的理解:
  • Join actually is equal to inner join
  • .select是和等效于 select在 SQL 中。你也可以添加
    aliases ( as in SQL )。
  • .addSelect类似于 , in select
  • There are two types of results you can get using select querybuilder: entities or raw results .描述你是否想要
    数据作为实体( getOnegetMany )或它什么
    是( getRawOnegetRawMany )。
  • 关于sql - TypeORM 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53553523/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com