2012-11-06 59 views
0

我有兩個表一個旅程和一個txns在oracle數據庫中有一對多的關係。 當我火了下面的查詢瞭解由ActiveRecord觸發的sql查詢

Trip.where("upper(trips.domain) = 'FOOBAR.COM' and txns.user_id = 50001 and txns.txn_type = '1'").includes([:txns]).order('trips.created_at desc').limit(10).offset(0) 

對於這個有在SQL日誌兩個查詢。

Trip Load (4920.4ms) SELECT * FROM (
    SELECT raw_sql_.*, rownum raw_rnum_ 
    FROM (SELECT DISTINCT "TM"."TRIPS".id, FIRST_VALUE(trips.created_at) 
OVER (PARTITION BY "TM"."TRIPS".id ORDER BY trips.created_at desc) AS alias_0__ FROM "TM"."TRIPS" LEFT OUTER JOIN "TXNS" ON "TXNS"."TRIP_ID" = "TM"."TRIPS"."ID" 
WHERE (upper(trips.domain) = 'FOOBAR.COM' and txns.txn_type = '1') 
ORDER BY alias_0__ DESC) raw_sql_ 
    ) 
    WHERE raw_rnum_ between 1 and 10 

    SQL (186.2ms) SELECT "TM"."TRIPS"."ID" AS t0_r0, "TM"."TRIPS"."TRIP_REF" AS t0_r1, "TM"."TRIPS"."TRIP_NAME" AS t0_r2, 
"TM"."TRIPS"."START_DATE_TIME" AS t0_r3, "TM"."TRIPS"."END_DATE_TIME" AS t0_r4, "TM"."TRIPS"."AMOUNT" AS t0_r5, "TM"."TRIPS"."CREATED_AT" AS t0_r6, 
"TM"."TRIPS"."UPDATED_AT" AS t0_r7, "TM"."TRIPS"."USER_ID" AS t0_r8, 
"TM"."TRIPS"."BOOKING_STATUS" AS t0_r9, "TM"."TRIPS"."TRAVELLERS" AS t0_r10, 
"TM"."TRIPS"."USER_TRIP_NAME" AS t0_r11, "TM"."TRIPS"."CONTACT_DETAIL_ID" AS t0_r12, 
"TM"."TRIPS"."AIR" AS t0_r13, "TM"."TRIPS"."HOTEL" AS t0_r14, "TM"."TRIPS"."DOMAIN" AS t0_r15, "TM"."TRIPS"."TRAIN" AS t0_r16, "TM"."TRIPS"."TAGS" AS t0_r17, "TM"."TRIPS"."CURRENCY" AS t0_r18, "TM"."TRIPS"."CUR_INR_VALUE" AS t0_r19, 
"TM"."TRIPS"."COMPANY_ID" AS t0_r20, "TXNS"."ID" AS t1_r0, "TXNS"."TRIP_ID" AS t1_r1, 
"TXNS"."USER_ID" AS t1_r2, "TXNS"."TXN_TYPE" AS t1_r3, "TXNS"."STATUS" AS t1_r4, "TXNS"."SOURCE_TYPE" AS t1_r5, "TXNS"."SOURCE_ID" AS t1_r6, "TXNS"."EXTERNAL_REFS" AS t1_r7, "TXNS"."CREATED_AT" AS t1_r8, "TXNS"."IP_NUMBER" AS t1_r9, "TXNS"."MISC" AS t1_r10 FROM "TM"."TRIPS" LEFT OUTER JOIN "TXNS" ON "TXNS"."TRIP_ID" = "TM"."TRIPS"."ID" WHERE "TM"."TRIPS"."ID" IN (11620660, 11620651, 11620649, 11620647, 11620646, 11620645, 11620644, 11620642, 11620641, 11620636) AND (upper(trips.domain) = 'FOOBAR.COM' and txns.txn_type = '1') ORDER BY trips.created_at desc 

我想知道爲什麼不活躍紀錄火兩個查詢

回答

1

您有兩個查詢的原因是您使用基於連接的包含(因爲您的where子句引用txns關聯中的列),並且因爲您有限制。

因爲你加入了很多導軌,所以不能只在你的查詢中加上一個極限10 - 如果你有一個10行的關聯txns,然後向查詢導軌添加限制10,通常會運行一個極端的例子只能返回1行(與10個匹配的txns中的每個行),而不是10個不同的行程

爲了解決這個問題,rails首先找到符合條件的前10行的行,然後觸發第二個查詢用包含的關聯加載這些行。

+0

所以在SQL中,我無法做到與parent.limit(10).joins(子項)等效並且限制工作正常嗎? – light24bulbs