2010-12-21 49 views
4

需要幫助轉移的SQL續集:
SQL:
需要幫助的SQL和Sequel涉及內部連接和地方/過濾器

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(?????) 

回答更好的成語比上面的讚賞,因爲well.Tnx。

UPDATE:
我要修改一點點,使其工作

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

+1

「續集」是老字號,現在我們稱之爲'SQL':) – Zabba 2010-12-21 14:12:44

回答

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') 
0

我想你總是可以使用類似

.filter('table_c.alpha_id = ? AND table_b.name = ?', 'XXX', 'Foo') 
-1

有一點要記住的是,Sequel很高興能讓你使用原始SQL。如果您發現查詢更容易表達爲SQL,請務必對其進行評論,以便稍後查找。然後你可以回到那條線並調整它,這樣它就可以利用Sequel的精彩。

儘量避免特定於特定DBM的任何內容,因爲您將降低可移植性,這是使用ORM生成查詢的重要原因之一。