2014-11-17 5 views
0

У меня есть сценарий, где мне нужно найти префикс, который соответствует всем строкам и столбцам под этим префиксом. Пожалуйста, ознакомьтесь с приведенным ниже примером, чтобы узнать, как сравнение работает.SQL: Сравнение нескольких столбцов и строк и поиск точного соответствия

Мое ожидание - найти подходящий префикс (но не то же имя префикса), который соответствует всем строкам и столбцам второй таблицы.

Каков наилучший способ написать запрос для этой цели.

TABLE1:

accm_pfx  accum_no  accm_value 
--------  --------  ---------- 
AA00   1   A 
AA00   3   B 
BB00   2   A 

TABLE2:

accm_pfx  accum_no  accm_value 
--------  --------  ---------- 
CC00   1   A 
CC00   3   B 
EE00   1   A 
EE00   2   B 
EE00   3   C 
DD00   9   B 

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:

table1.accm_pfx matching_accm_pfx  table1.accum_no  table1.accm_value 
--------   ---------------  ----------   ---------- 
AA00    CC00     1     A 
AA00    CC00     3     B 
+0

Что вы пробовали? Что такое РСУБД? Являются ли матчи в двух направлениях? Должен ли он быть 1-1 (т. Е. По 2 строки в каждом), или если у CC00 была еще одна строка, будет ли она соответствовать? Или наоборот? –

+0

Я все еще пытаюсь написать этот запрос, сначала сопоставьте количество строк в одном и том же префиксе, а затем сравните остальные строки и столбцы, я опубликую, если я смогу получить прорыв. – Chito

+0

@KyleHale, это один из способов от Table1 до Table2. Не должно быть никакого результата совпадения, если количество строк не одинаково (меньше или больше). Это должно быть точное совпадение с количеством строк и значений в остальной части столбца. И каждый префикс может иметь различное количество строк, не всегда 2 строки. – Chito

ответ

0

Ваши требования о том, что представляет собой матч не ясны, но это получает вас большую часть пути туда (извините за глупые псевдонимами, вы получите то, что вы платите за :)

with results as (

select 

table1.accm_prfx as a, 
table2.accm_prfx as b, 
table1.accum_no, 
table1.accum_value, 
count(1) over (partition by table1_a.accm_prfx)/count(1) over (partition by table1.accm_prfx, table1_a.accum_no, table1_a.accum_value) as TotalRowsA, 
count(1) over (partition by table1.accm_prfx, table2.accm_prfx) as matches, 
count(1) over (partition by table2_a.accm_prfx)/count(1) over (partition by table2.accm_prfx, table2_a.accum_no, table2_a.accum_value) as TotalRowsB 




from table1 inner join table2 on table2.accum_no = table1.accum_no and table1.accum_value = table2.accum_value 
inner join table1 table1_a on table1_a.accm_prfx = table1.accm_prfx 
inner join table2 table2_a on table2_a.accm_prfx = table2.accm_prfx 
) 

select distinct a, b, accum_no, accum_value from results 
where 
totalrowsa = totalRowsB 
and matches = power(totalRowsA,3) 

Шаг 1. Найдите совпадения и общие строки в таблице A и B для каждого префикса. Шаг 2: Общее количество совпадений должно быть идеальным кубом количества строк. (2 совпадения * 2 строки в таблице1 * 2 строки в таблице2.)

+0

ваш ответ - это решение, которое я ищу. Я изменил свой сценарий, и он отлично работает, спасибо – Chito

0

Я мог бы понять, что мисс вы ищете, но это звучит как вы хотите присоединиться к двум таблицам на ac cum_no и accm_value?

SELECT 
    t1.accm_pfx, t2.accm_pfx, t1.accum_no, t1.accm_value 
FROM 
    table1 t1 
INNER JOIN 
    table2 t2 
ON 
    t1.accum_no = t2.accum_no and t1.accm_value = t2.accm_value 
+0

No @Kyle Gobel, тот, который вы даете, просто соединяется. Я больше нахожу префикс, который имеет такое же количество строк и соответствует всем значениям. – Chito

+0

Итак, просто чтобы убедиться, что я на правильной странице. Вам нужны все строки, в которых '' accm_pfx'' имеет одинаковое количество строк (т. Е. AA00 имеет 2 строки, а CC00 имеет 2 строки) И '' acc_no'', и '' acc_value'' для этих строк –

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