2014-03-03 3 views
0

у меня есть следующие две таблицыкак повернуть одну из двух таблиц?

username   data_usage   cost 
    -----    ------   ---- 
user1    50   159 
user2    250  376 
user3    150  225 


    username  user1  user2  user3 
    -----  -----  -----  ----- 
data_usage   50  200  150 
cost  159  376  225 

, и я хочу, чтобы проверить, если значения равны в обеих таблицах, но проблема заключается в том, что имя пользователя, в первой таблице имя столбца и его значение в секунду таблицы

так что все равно нужно вращать эти таблицы в оракуле с помощью PL/SQL? или любым другим способом сделать это?

выход будет как этот

user1 has different values column name data usage 250 at first table and 200 at table2 

ответ

2

Используя стержень и UNPIVOT если версия базы данных> = Oracle 11,2

WITH table1(username,data_usage,cost) AS (
SELECT 'user1', 50, 159 FROM dual UNION ALL 
SELECT 'user2', 250, 376 FROM dual UNION ALL 
SELECT 'user3', 150, 225 FROM dual), 
table2(username,user1,user2,user3) AS (
SELECT 'data_usage', 50, 200, 150 FROM dual UNION ALL 
SELECT 'cost', 159, 376, 225 FROM dual) 
--- 
--End of data preparation 
--- 
select tb.username || ' has different values column name data usage '|| tb.data_usage ||' at first table and '|| ta.data_usage ||' at table2' as text 
from (select * 
     from table2 
    unpivot (val for users in (user1 as 'user1', user2 as 'user2', user3 as 'user3')) 
     pivot (min(val) for username in ('data_usage' as data_usage, 'cost' as cost))) ta 
join table1 tb on (username = users) 
WHERE ta.data_usage <> tb.data_usage; 

Ouput:

|                     TEXT | 
|----------------------------------------------------------------------------------------| 
| user2 has different values column name data usage 250 at first table and 200 at table2 | 

Просто используйте этот запрос

select tb.username || ' has different values column name data usage '|| tb.data_usage ||' at first table and '|| ta.data_usage ||' at table2' as text 
from (select * 
     from table2 
    unpivot (val for users in (user1 as 'user1', user2 as 'user2', user3 as 'user3')) 
     pivot (min(val) for username in ('data_usage' as data_usage, 'cost' as cost))) ta 
join table1 tb on (username = users) 
WHERE ta.data_usage <> tb.data_usage; 

Заменить table1 и таблица2 с именами таблиц

+0

, если я должен написать выберите Постулаты для каждой записи Thats будет бесполезно сог я имел около 1 млн записей Thats как раз пример того, что я хочу – sam

+0

Не сочтите часть выше «Конец подготовки данных» как часть запроса, это делается для того, чтобы избежать создания физической таблицы на моем конце. Используйте только более позднюю часть (т. Е. После «Конец подготовки данных») и замените таблицы 1 и таблицу 2 на свои имена таблиц. – San

+0

http://sqlfiddle.com/#!4/623b6 – sam

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