2013-05-24 4 views
0

У меня есть таблица, которая содержит следующие:Выбрать столбцы, основанные на CSV в другой таблице

Table1

ID Range  Rate 
1 A,B,C,D,E,F 1.2 
2 A,B,C   3.1 

и другую таблицу:

Table2

ID A B C D E F G H J K 
1 1 2 1 3 4 2 4 5 8 1  
2 1 2 1 3 4 2 4 5 8 1  

В принципе это говорит нам, в каких столбцах мы можем применить ставку, например, мы можем применить ставку 1.2 к значениям, которые хранящиеся в столбцах A, B, C, D, E, F таблицы 2 и скорости 3,2, должны применяться только к столбцам A, B и C.

Я присоединяюсь две таблицы на ID колонке

Select * From Table1 
Inner Join Table2 ON Table1.ID = Table2.ID 

Но что я пытаюсь достичь после присоединения к 2 таблицы, чтобы выбрать столбцы из Table2 на основе содержимого столбца диапазона Table1 ,

На основании приведенного выше примера из таблицы 1 поле диапазона первого столбца имеет: A, B, C, D, E, F, поэтому из таблицы 2 я пытаюсь выбрать только столбцы A, B, C, D, E, F и применить норму (1.2) для всех из них и оставить остальные столбцы нетронутых, так что решение будет выглядеть следующим образом:

ID A  B  C  D  E  F  G H J K 
1 1*1.2 2*1.2 1*1.2 3*1.2 4*1.2 2*1.2 4 5 8 1 
2 1*3.1 2*3.1 1*3.1 3  4  2  4 5 8 1 

Надеется, что это имеет смысл.

Благодаря

+0

, и вы пытаетесь сделать это в одном выражении выбора SQL? – paul

+1

Эти таблицы должны быть почти наверняка нормализованы. Трудно сказать наверняка, ничего не зная о данных. –

+0

Не нужно быть в одном SQL, и, к сожалению, нормализация на данный момент не является опцией. – 03Usr

ответ

2

Вы ищете подстроки в разделенных запятыми списке. Стандартный способ SQL, чтобы сделать это использует like:

select t2.id, 
     t2.a * (case when ','||Range||',' like '%,A,%' then t1.rate else 1 else end) as a, 
     t2.b * (case when ','||Range||',' like '%,B,%' then t1.rate else 1 else end) as b, 
     t2.c * (case when ','||Range||',' like '%,C,%' then t1.rate else 1 else end) as c, 
     t2.d * (case when ','||Range||',' like '%,D,%' then t1.rate else 1 else end) as d, 
     t2.e * (case when ','||Range||',' like '%,E,%' then t1.rate else 1 else end) as e, 
     t2.f * (case when ','||Range||',' like '%,F,%' then t1.rate else 1 else end) as f, 
     t2.g * (case when ','||Range||',' like '%,G,%' then t1.rate else 1 else end) as g, 
     t2.h * (case when ','||Range||',' like '%,H,%' then t1.rate else 1 else end) as h, 
     t2.j * (case when ','||Range||',' like '%,J,%' then t1.rate else 1 else end) as j, 
     t2.k * (case when ','||Range||',' like '%,K,%' then t1.rate else 1 else end) as k 
from Table1 t1 left join 
    Table2 t2 
    on t1.id = t2.id; 

В частности, это ограничен диапазон, так что каждое значение имеет запятую до и после (в том числе первых и последние из них). Затем он ищет patter для каждого значения.

Следует отметить, что этот тип запроса является показателем плохой структуры данных. Ваша таблица 1 должна иметь отдельные строки для каждого значения.

2

Не очень (очень хрупкий), но:

select case when 'A' in t1.Range then t2.a * t1.rate else t2.a else end a, 
     case when 'B' in t1.Range then t2.b * t1.rate else t2.b else end b, 
     case when 'C' in t1.Range then t2.c * t1.rate else t2.c else end c, 
     case when 'D' in t1.Range then t2.d * t1.rate else t2.d else end d, 
     ... 
from Table1 t1 left join Table2 t2 on t1.id = t2.id 
Смежные вопросы