需要帮助转移sql到续集:
SQL:
SELECT table_t.curr_id FROM table_t
INNER JOIN table_c ON table_c.curr_id = table_t.curr_id
INNER JOIN table_b ON table_b.bic = table_t.bic
WHERE table_c.alpha_id = 'XXX' AND table_b.name='Foo';
我陷入了续集,我不知道如何过滤,到目前为止这样:
cid= table_t.select(:curr_id).
join(:table_c, :curr_id=>:curr_id).
join(:table_b, :bic=>:bic).
filter( ????? )
以上的成语比上面的答案也很受欢迎.Tnx。
更新
我必须稍微修改才能使其正常工作
cid = DB[:table_t].select(:table_t__curr_id).
join(:table_c, :curr_id=>:curr_id).
join(:table_b, :bic=>:table_t__bic). #add table_t or else ERROR: column table_c.bic does not exist
filter(:table_c__alpha_id => 'XXX',
:table_b__name => 'Foo')
没有过滤器,
cid = DB[:table_t].select(:table_t__curr_id).
join(:table_c, :curr_id=>:curr_id, :alpha_id=>'XXX').
join(:table_b, :bic=>:table_t__bic, :name=>'Foo')
btw我使用的是pgsql 9.0
答案 0 :(得分:7)
这是纯粹的续集方式:
cid = DB[:table_t].select(:table_t__curr_id).
join(:table_c, :curr_id=>:curr_id).
join(:table_b, :bic=>:bic).
filter(:table_c__alpha_id => 'XXX',
:table_b__name => 'Foo')
请注意,您也可以在没有WHERE的情况下执行此操作,因为您使用的是INNER JOIN:
cid = DB[:table_t].select(:table_t__curr_id).
join(:table_c, :curr_id=>:curr_id, :alpha_id=>'XXX').
join(:table_b, :bic=>:bic, :name=>'Foo')
答案 1 :(得分:0)
我认为你总能使用像
这样的东西.filter('table_c.alpha_id = ? AND table_b.name = ?', 'XXX', 'Foo')
答案 2 :(得分:-1)
要记住的一件事是Sequel非常乐意让你使用原始SQL。如果您发现在SQL继续时更容易表达查询,请务必对其进行注释,以便以后可以找到它。然后你可以回到那条线并进行调整,这样就可以充分利用Sequel的精彩。
尽量避免使用特定于某个DBM的任何内容,因为您将减少可移植性,这是使用ORM生成查询的重要原因之一。