Нужна помощь в SQL и Sequel, включая внутреннее соединение и где / фильтр - PullRequest
4 голосов
/ 21 декабря 2010

Нужна помощь, чтобы перенести 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( ????? )  

Также ценится ответ с лучшим идиомным выражением, чем выше.*

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

Ответы [ 3 ]

7 голосов
/ 21 декабря 2010

Это чистый способ продолжения:

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 голосов
/ 21 декабря 2010

Следует помнить, что Sequel очень рад, что вы можете использовать сырой SQL. Если вам проще выразить запрос как SQL, просто прокомментируйте его, чтобы найти его позже. Затем вы можете вернуться к этой строке и настроить ее таким образом, чтобы она использовала потрясающую динамику сиквела.

Постарайтесь избегать всего, что специфично для конкретной DBM, потому что вы будете уменьшать переносимость, что является одной из главных причин использования ORM для генерации запросов.

0 голосов
/ 21 декабря 2010

Я думаю, что вы всегда можете использовать что-то вроде

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