在SQL和Sequel中需要帮助,包括内连接和where / filter

时间:2010-12-21 14:11:31

标签: sql ruby sequel

需要帮助转移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

3 个答案:

答案 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生成查询的重要原因之一。