2016-06-22 2 views
1

Я хочу присоединиться к 2 таблицам на основе приоритетов столбцовприсоединение на основе приоритетов столбцов

ex. Предположим, что Table1 имеет шесть колонок (col1, col2, COL3, COL4, Col5, Col6) Если я хочу присоединиться к таблице 1 с table2 (Col1, Col2, Col3, COL4, Col5, Col7), он должен

иначе

Select Table2.col7 
where 
first check col1 , col2 and col3 if match found no need go check more 
second check col1 , col2 if match found no need go check more 
third check col1 if match found no need go check more 
last ignore all col1 , col2 and col3 
AND Table1.Col4=Table2.Col4 
AND Table1.Col5=Table2.Col5 

не может быть ясно, с моими словами, если какая-либо проблема, пожалуйста, кричите

+0

Используйте 'OR' вместо 'AND'. Если совпадение найдено, другие условия не отмечены – Dany

+0

(!!!) UPD: Я ошибаюсь: http://stackoverflow.com/questions/8900631/does-oracle-use-short-circuit-evaluation – Dany

ответ

0
Select t2.col7 
    from Table1 t1 inner join Table2 t2 
    on 
    case 
    when t1.col1 = t2.col1 then 1 
    when t1.col2 = t2.col2 then 1 
    when t1.col3 = t2.col3 then 1 
    when t1.Col4=t2.Col4 
     and t1.Col5=t2.Col5 then 1 
    else 0 end = 1 
    ; 
+0

@ user6498752 Я отредактировал ответ. скажите, если это то, что вы ищете – vercelli

+0

Спасибо Vercelli за ваше время, но у меня есть еще одна проблема здесь, выбор должен основываться на значениях t1.col4 и t1.col5, что я имею в виду, если у меня есть значения t1.col4 как (A , B) и t1.col5 (1,0), поэтому у нас будет 4 варианта для комбинации (t1.col4, t1.col5) = (A, 1), (A, 0), (B, 0) , (B, 1) для каждой комбинации, он идет ниже проверок case , когда t1.col1 = t2.col1, затем 1 , когда t1.col2 = t2.col2, затем 1 , когда t1.col3 = t2.col3, затем 1 else 0 end = 1 Надеюсь, вы тоже скоро мне поможете ... большое спасибо заранее – user6498752

+0

@vercelli: выражения 'CASE' не относятся к предложению' WHERE'. Вместо этого используйте простые 'AND' и' OR'. –

0

Вы не можете сказать, SQL, чтобы попытаться вступить в определенном состоянии первым и в случае, если он не находит спички, чтобы пойти на поиск. Вы можете использовать все допустимые комбинации (совпадения на col4 и col5 в вашем случае), а затем ранжировать ваши совпадения (так что совпадение на col1 и col2 и col3 считается лучшим и т. Д.). Тогда соблюдайте самые лучшие совпадения:

select col7 
from 
(
    select 
    t1.*, 
    t2.*, 
    row_number() over 
    (
     partition by t1.col4, t1.col5 
     order by case 
     when t2.col1 = t1.col1 and t2.col2 = t1.col2 and t2.col3 = t1.col3 then 1 
     when t2.col1 = t1.col1 and t2.col2 = t1.col2 then 2 
     when t2.col1 = t1.col1 then 3 
     else 4 
    ) as rn 
    from table1 t1 
    join table2 t2 on t2.col4 = t1.col4 and t2.col5 = t1.col5 
) 
where rn = 1; 
+0

Спасибо спасибо Торстен и Верчелли, я пытаюсь запустить код ниже, но ошибка сбрасывания BTW, я представил еще одну таблицу сейчас. – user6498752

+0

выберите DISTINCT CU.ID cu_id, 'XXXX', to_char (RR.EFF_FROM, 'DD-MON-YYYY') Active_Date, NVL (to_char (RR.EFF_TO, 'DD-MON-YYYY'), '31 -DEC- 9999') Inactive_Date из ( Выберите RL. *, CU. *, RR. *, row_number() над ( раздел по RR.Divi_Flag, RR.Brand_Type_Code заказа на случай когда RR.Dept_Cd = ПОЛА (RL.Sub_Section/10000) и RR.Section = FLOOR (MOD (RL.Sub_Section, 10000)/100) и RR.SubSection = MOD (RL.Sub_Section, 100), затем 1 , когда RR.Dept_Cd = FLOOR (RL. Sub_Section/10000) и RR.Section = FLOOR (MOD (RL.Sub_Section, 10000)/100), затем 2 – user6498752

+0

, когда RR.Dept_Cd = FLOOR (RL.Sub_Section/10000), затем 3 еще 4 ) как rn от TABLE1 RL, TABLE2 CU, ТАБЛИЦА 3 RR WHERE RL.Code = CU.FK_Rl_Code И RL.Brand_Type_Code = RR.Brand_Type_Code и NVL (CU.Dividend_Flag, 'X') = NVL (RR.Divi_Flag, 'X') ГДЕ cu.skeletal_full_ind = 'F' И cu.discontinued_date IS NULL ) где rn = 1; – user6498752

Смежные вопросы