AREL README简要介绍了CTE,但未提及如何处理CTE中的显式列列表。例如。 CTE如:
WITH my_query (col1, col2, col3, col4) AS (
SELECT a, b, a, b FROM my_table
)
我能够使用复杂的SqlLiteral生成上述内容,但是有更好的方法吗?
示例解决方案:
cte_table = Arel::Table.new(:source_qry)
cte_qry = Arel::Nodes::SqlLiteral.new("source_qry (col1, col2, col3, col4)")
user_qry = Arel::Nodes::SqlLiteral.new("(SELECT a, b, a, b FROM my_table)")
cte_table_qry = Arel::Nodes::As.new(cte_qry, user_qry)
cte_table.project(%w(col1 col2)).with(cte_table_qry)
答案 0 :(得分:0)
我认为Arel暂时不会处理这个问题。我不知道如何彻底解决这个问题,但可以建议如何改进你的解决方案:
cte_table = Arel::Table.new(:source_qry)
cte_qry = Arel.sql("source_qry (col1, col2, col3, col4)")
my_table = Arel::Table.new(:my_table)
user_qry = my_table.project(my_table[:a], my_table[:b], my_table[:a], my_table[:b])
cte_table_qry = Arel::Nodes::As.new(cte_qry, user_qry)
cte_table.project(cte_table[:col1], cte_table[:col2]).with(cte_table_qry)