2017-05-31 104 views
0

我已經搜索,但可以找到任何適合我需要的例子。也許我迷失在我的查詢的許多聯合...子查詢裏面的兆查詢

我從三個Oracle 11g表--ATE_TESTS,ATE_DATA和TM_CONDITION_DYNAMIC返回數據。查詢有其他表加入這些表。事實上,有不少於7個連接。

ATE_DATA可能在連接的多邊有多條記錄,但我只想要最後一行寫入的行。 ATE_DATA有一個遞增的主鍵,我希望在子查詢中的聚合函數MAX(DATA_PK)中使用它。我認爲它應該在主查詢的WHERE子句中,但我不知道如何實現這個,並且可能有更好的方法。

也許我可能受過教育?

我的查詢是:

SELECT ate_serial, data_data, dyn_value 
FROM ate_tests 
     LEFT JOIN ate_test_procedure 
     ON ate_tests.ate_pk = ate_test_procedure.proc_ate_test_fk 
     LEFT JOIN ate_test_data 
     ON ate_test_procedure.proc_pk = ate_test_data.data_ate_test_procedure_fk 
     LEFT JOIN tm_test_procedure 
     ON ate_test_procedure.proc_test_procedure = tm_test_procedure.proc_pk 
     LEFT JOIN tm_test_specification 
     ON ate_test_data.data_specification = tm_test_specification.spec_pk 
     LEFT JOIN tm_test_condition_dynamic 
     ON tm_test_specification.spec_condition_set_fk = tm_test_condition_dynamic.dyn_condition_set_fk 
     LEFT JOIN tm_test_sequences 
     ON ate_tests.ate_sequence_fk = tm_test_sequences.seq_pk 
     LEFT JOIN lu_tm_products_model 
     ON tm_test_sequences.seq_model = lu_tm_products_model.lumod_pk 
WHERE upper(spec_name) = 'POWER' 
AND lumod_model = 'AMP' 
AND dyn_value = '136' 
AND ate_yield = 1 
AND upper(proc_procedure_name) = 'FINAL TEST' 
AND proc_report = 1 
AND proc_status = 1 
ORDER BY ate_serial, dyn_value 
+1

目前的情況是,我們並不知道你的表,你的數據也正是您想要查詢做什麼。請嘗試製作一個簡單的測試用例,足以證明您希望實現的目標(當然,只需要2或3個連接來演示您的場景?)以及相應的輸入和預期輸出數據。 – Boneist

+0

謝謝骨科醫生。我會用一個例子發佈一個縮小的查詢。 – user8091894

+0

根據發佈的查詢,我們是否應該假設問題中引用爲「ATE_DATA」的表實際上是「ATE_TEST_DATA」,而「TM_CONDITION_DYNAMIC」實際上是「TM_TEST_CONDITION_DYNAMIC」?如果是這樣,請更正問題中提到的表名。謝謝。 –

回答

0

...但我只希望最後寫入一行。

這是典型的top-n查詢。假設表a包含有關蔬菜的信息,表b它們在不同商店的歷史價格以及s有關這些商店的信息。您只有在最後的價格 ,您可以使用功能row_number()(或max() ... keep dense rank last...)找到感興趣。

with a as (select 1 vid, 'Tomato' name from dual union all 
      select 2 vid, 'Potato' name from dual union all 
      select 3 vid, 'Garlic' name from dual), 

    b as (select 1 pid, 1 vid, 1 sid, 11.5 price from dual union all 
      select 2 pid, 3 vid, 1 sid, 31.8 price from dual union all 
      select 3 pid, 1 vid, 1 sid, 13.2 price from dual union all 
      select 4 pid, 1 vid, 2 sid, 12.7 price from dual), 

    s as (select 1 sid, 'Best Vegetables' name from dual union all 
      select 2 sid, 'Organic Products' name from dual) 

select a.vid, a.name, s.name as shop, p.price as last_price 
    from a 
    left join (select vid, sid, price 
       from (select vid, sid, price, 
           row_number() over (partition by vid order by pid desc) rn 
         from b) 
       where rn = 1) p 
     on p.vid = a.vid 
    left join s on s.sid = p.sid 
    order by a.vid 

輸出:

VID Name  Shop    Price 
--- -------- ------------------ ------- 
    1 Tomato Organic Products  12.7 
    2 Potato 
    3 Garlic Best Vegetables  31.8 
+0

謝謝,但我現在真的迷失了。我確信這是一個解決方案,但它逃避了我在做什麼以及如何將它實現到我的SQL中。 – user8091894