【发布时间】:2015-02-18 14:31:47
【问题描述】:
我收到以下错误:
ERROR: subquery in FROM must have an alias
LINE 11: (SELECT "domiciles"."id" AS id,
^
HINT: For example, FROM (SELECT ...) [AS] foo.
使用以下 SQL 查询:
SELECT "domiciles".*
FROM "domiciles"
LEFT OUTER JOIN
(SELECT "domiciles"."id" AS id,
string_agg("locations"."name"::text, ' ') AS name
FROM "domiciles"
INNER JOIN "locations" ON "locations"."id" = "domiciles"."place_id"
AND "locations"."type" IN ('Place')
GROUP BY "domiciles"."id") place ON place.id = "domiciles"."id"
LEFT OUTER JOIN
(SELECT "domiciles"."id" AS id,
string_agg("accounts"."email"::text, ' ') AS email
FROM "domiciles"
INNER JOIN "accounts" ON "accounts"."id" = "domiciles"."user_id"
AND "accounts"."type" IN ('User')
GROUP BY "domiciles"."id") user ON user.id = "domiciles"."id"
WHERE "domiciles"."deleted_at" IS NULL
我已尝试在查询的许多部分添加 AS 'some_text',但无法解决此问题。有什么想法吗?
这里是完整的 SQL 查询,以了解我想要做什么:
SELECT "domiciles".*,
((ts_rank((to_tsvector('german', unaccent(coalesce("domiciles"."is_default"::text, ''))) || to_tsvector('german', unaccent(coalesce("domiciles"."created_at"::text, ''))) || to_tsvector('german', unaccent(coalesce("domiciles"."updated_at"::text, ''))) || to_tsvector('german', unaccent(coalesce(place.name::text, ''))) || to_tsvector('german', unaccent(coalesce(user.email::text, ''))) || to_tsvector('german', unaccent(coalesce(owner.email::text, '')))), (to_tsquery('german', ''' ' || unaccent('abc') || ' ''' || ':*')), 0))) AS pg_search_rank
FROM "domiciles"
LEFT OUTER JOIN
(SELECT "domiciles"."id" AS id,
string_agg("locations"."name"::text, ' ') AS name
FROM "domiciles"
INNER JOIN "locations" ON "locations"."id" = "domiciles"."place_id"
AND "locations"."type" IN ('Place')
AND "locations"."deleted_at" IS NULL
GROUP BY "domiciles"."id") place ON place.id = "domiciles"."id"
LEFT OUTER JOIN
(SELECT "domiciles"."id" AS id,
string_agg("accounts"."email"::text, ' ') AS email
FROM "domiciles"
INNER JOIN "accounts" ON "accounts"."id" = "domiciles"."user_id"
AND "accounts"."type" IN ('User')
AND "accounts"."deleted_at" IS NULL
GROUP BY "domiciles"."id") user ON user.id = "domiciles"."id"
LEFT OUTER JOIN
(SELECT "domiciles"."id" AS id,
string_agg("accounts"."email"::text, ' ') AS email
FROM "domiciles"
INNER JOIN "locations" ON "locations"."id" = "domiciles"."place_id"
AND "locations"."type" IN ('Place')
AND "locations"."deleted_at" IS NULL
INNER JOIN "accounts" ON "accounts"."id" = "locations"."user_id"
AND "accounts"."type" IN ('User')
AND "accounts"."deleted_at" IS NULL
GROUP BY "domiciles"."id") owner ON owner.id = "domiciles"."id"
WHERE "domiciles"."deleted_at" IS NULL
AND "domiciles"."user_id" = $1
AND (((to_tsvector('german', unaccent(coalesce("domiciles"."is_default"::text, ''))) || to_tsvector('german', unaccent(coalesce("domiciles"."created_at"::text, ''))) || to_tsvector('german', unaccent(coalesce("domiciles"."updated_at"::text, ''))) || to_tsvector('german', unaccent(coalesce(place.name::text, ''))) || to_tsvector('german', unaccent(coalesce(user.email::text, ''))) || to_tsvector('german', unaccent(coalesce(owner.email::text, '')))) @@ (to_tsquery('german', ''' ' || unaccent('abc') || ' ''' || ':*'))))
【问题讨论】:
-
GROUP BY "domiciles"."id") user ON user.id = "domiciles"."id""user" 是保留字。不要使用它(这里)只需将其重命名为“uuu”或其他东西(这里) -
谢谢@wildplasser!使用
GROUP BY "domiciles"."id") "user" ON "user"."id" = "domiciles"."id"可以解决问题。看我的回答。
标签: sql ruby-on-rails postgresql orm