【问题标题】:Specifying Sub query in FROM clause in Sequalize在 Sequelize 的 FROM 子句中指定子查询
【发布时间】:2021-03-01 18:08:09
【问题描述】:

我正在使用 Sequalize ORM 从数据库中获取数据。我有下面的查询要执行,它在 Postgres DB 中运行良好,我想对其进行隔离,具体来说,我的查询与如何隔离 FROM 子句中的子查询部分有关。

SELECT
  "users"."id",
  "users"."user_id" AS "peopleId",
  "users"."first_name" AS "firstName",
  "users"."last_name" AS "lastName",
  "users"."email",
  "users"."mobile",
  "users"."status"
FROM (select * from users where address_id in (select addresses_id from location_view where location = 'Some, Location, India')) as "users"
  LEFT OUTER JOIN "addresses" AS "addresses" ON "users"."address_id" = "addresses"."id"
  LEFT OUTER JOIN "countries" AS "addresses->countries" ON "addresses"."country_id" = "addresses->countries"."id"
  LEFT OUTER JOIN "work_info" AS "work_info" ON "users"."work_info_id" = "work_info"."id"
WHERE
  "users"."status" = 'Active'
ORDER BY
  "users"."first_name" ASC
LIMIT
  5 OFFSET 0;

我知道我们确实有 Sequalize.query 和文字方法来实现这一点,我可以直接以原始格式指定我的子查询,但无论我用谷歌搜索的任何示例基本上都提供了一种我可以编写原始查询的方法WHERE 或选择属性子查询条件。

我无法找到一种方法,我将使用主模型的子查询来执行 findAndCountAll,在这种情况下,假设是 usersModel.findAndCountAll。 此外,我需要为需要从中选择数据的其他一些表进行 JOIN(查询中未提及)。

如何使用 Sequalize 达到同样的效果?

【问题讨论】:

  • 如果你能写出体面的 SQL,那么地球上是否有一个理由使用 Sequalize 查询生成器的专有、神秘、模糊的语法(顺便说一句,其他查询生成器也没有更好)而不是标准的原生 SQL ?无论如何,您正在考虑关系。

标签: mysql node.js postgresql orm sequelize.js


【解决方案1】:

也许您根本不需要子查询?这是相同的查询,但被展平了。

SELECT
  "users"."id",
  "users"."user_id" AS "peopleId",
  "users"."first_name" AS "firstName",
  "users"."last_name" AS "lastName",
  "users"."email",
  "users"."mobile",
  "users"."status"
FROM "users"
  LEFT OUTER JOIN location_view lv on "users".address_id = lv.addresses_id
  LEFT OUTER JOIN "addresses" AS "addresses" ON "users"."address_id" = "addresses"."id"
  LEFT OUTER JOIN "countries" AS "addresses->countries" ON "addresses"."country_id" = "addresses->countries"."id"
  LEFT OUTER JOIN "work_info" AS "work_info" ON "users"."work_info_id" = "work_info"."id"
WHERE
  "users"."status" = 'Active' AND lv.location = 'Some, Location, India'
ORDER BY
  "users"."first_name" ASC
LIMIT
  5 OFFSET 0;

为了尽可能接近您的查询,我保留了双引号,但请注意,仅当名称包含大写字母和/或非字母数字字符时才需要双引号。

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多