4

需要帮助转移sql到sequel:
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')

顺便说一句,我使用 pgsql 9.0

4

3 回答 3

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')
于 2010-12-21T16:47:49.877 回答
0

我认为你总是可以使用类似的东西

.filter('table_c.alpha_id = ? AND table_b.name = ?', 'XXX', 'Foo')
于 2010-12-21T14:37:28.057 回答
-1

要记住的一件事是,Sequel 很乐意让您使用原始 SQL。如果您发现用 SQL 继续表达查询更容易,请务必对其进行注释,以便以后找到它。然后你可以回到那条线并调整它,这样它就可以利用 Sequel 的精彩。

尽量避免任何特定于特定 DBM 的内容,因为您将降低可移植性,这是使用 ORM 生成查询的重要原因之一。

于 2010-12-21T16:35:33.137 回答