[英]PgSQL - to_tsquery and JOINS leads to Error in Rails
我有以下查詢:
query = param.tag_list.join("|")
title = "ts_headline(title, query) AS title"
rank = "ts_rank_cd(tsv, query) AS rank"
Job.select(
[
title, rank, :starts_at, :slug, :job_position_id, :id, :city_id,
:company_office_id
]
).from(
"jobs, to_tsquery('english', '#{query}') AS query"
).where(
"tsv @@ query AND enabled = true"
).with_position.with_city.with_office.order(
"rank DESC, starts_at DESC"
).limit(limit)
with_ *范圍僅包含職位,城市,辦公室的內容。 不多。
這導致Arel進行查詢並產生錯誤:
ActiveRecord :: StatementInvalid-PG :: Error:錯誤:對表“ jobs”的FROM子句條目的引用無效第1行:... ER JOIN“ job_positions” ON“ job_positions”。“ id” =“ jobs”。“ jo ... ^提示:表“ jobs”有一個條目,但是不能從查詢的這一部分中引用它。
這很可能與混合隱式和顯式JOINS的問題有關。 另請參見此錯誤:對FROM子句的無效引用
問題是我不知道如何使用to_tsquery重寫查詢,以便它能正常工作?
任何想法提前Muchas gracias
更新
最后,由Arel產生的確切查詢。 錯誤是指第一個LEFT OUTER JOIN中的jobs.job_position_id
SELECT
...
FROM
jobs, to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AS query
LEFT OUTER JOIN
"job_positions" ON "job_positions"."id" = "jobs"."job_position_id"
LEFT OUTER JOIN
"cities" ON "cities"."id" = "jobs"."city_id"
LEFT OUTER JOIN
"company_offices" ON "company_offices"."id" = "jobs"."company_office_id"
LEFT OUTER JOIN
"companies" ON "companies"."id" = "company_offices"."company_id"
WHERE
(tsv @@ query AND enabled = true)
ORDER BY
rank DESC, starts_at DESC
LIMIT 9
很難確切地知道錯誤的出處是什么,而實際上沒有實際生成的SQL,但是幾乎可以肯定的是,您在引用的子查詢中的作業與查詢樹中的作業處於同一級別。
基本上,無效的構造如下:
select ...
from foo, (select ... from bar where bar.x = foo.y) as baz
最簡單的解決方法通常是相應地為事物添加別名:
select ...
from foo, (select ... from bar, foo as foo2 where bar.x = foo2.y and ...) as baz
參見以下示例的問題:
SQL子查詢問題,“錯誤:對FROM子句條目的引用無效……”
就您而言,這是:
FROM
jobs, to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AS query
WHERE
(tsv @@ query AND enabled = true)
應該:
FROM
jobs
WHERE
(tsv @@ to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AND enabled = true)
這也應該工作:
FROM
( select to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AS query ) q,
jobs
WHERE
(tsv @@ q.query AND enabled = true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.