1

I have 3 tables table1,table2,table3.Each having same structure.I want to compare their rows on basis of one column.

structure of tables

table1

country_code  country_name rate vendor
91            india        2.0   abc
92            pak          1.0   abc

table2

country_code  country_name rate vendor
91            india        2.1   abc1
92            pak          1.1   abc1
93            afgan        1.1   abc1

table3

country_code  country_name rate vendor
91            india        2.2   abc2
92            pak          1.2   abc2
93            afgan        1.2   abc2
880           bang         1.2   abc2


desired output is 
    country_code  country_name rate vendor rate vendor   rate  vendor
    91            india        2.0   abc   2.1   abc1     2.2    abc2
    92            pak          1.0   abc   1.1   abc1     1.2    abc2
    93            afgan                    1.1   abc1     1.2    abc2
    880           bang                                    1.2    abc2

I tried full outer join but did not get desired result. I used this query

SELECT * 
FROM table1 a 
   FULL OUTER JOIN table2 b ON a.country_code=b.country_code 
   FULL OUTER JOIN table3 c ON c.country_code=a.country_code ;  

and result of above query is

91  india  2   91  india  2.1   91  india   2.2 
92  pak    1   92   pak   1.1   92  pak     1.2
               93  afgan  1.1 
                                880 bang    1.2
                                93  afgan   1.2

but I want it like

91  india  2   91  india  2.1   91  india   2.2 
92  pak    1   92   pak   1.1   92  pak     1.2
               93  afgan  1.1   93  afgan   1.2
                                880 bang    1.2

1 Answers1

1

this should work:

select * from
(
select distinct  t3.country_code,
   t3.country_name,
   t1.rate,
   t1.vendor,
   t2.rate,
   t2.vendor,
   t3.rate,
   t3.vendor
   from (select * from table1 t1 union
         select * from table2 t2 union
         select * from table3 t3
   ) allk left join table1 t1 on allk.country_code = t1.country_code 
    left join table2 t2  on allk.country_code = t2.country_code
    left join table3 t3 on allk.country_code = t3.country_code
   ) a
   order by case
       when a.country_code like '9%' then 1
       else 2
     end nulls last;
light souls
  • 698
  • 1
  • 8
  • 17
  • this query will not work if we change data of our tables .If table1 will have some rows which are not i table2 or table3 then we will not get desired result.Please provide dynamic query – Ankit Bhatt Mar 15 '17 at 12:31
  • i changed the query. you can also look at [this link](http://stackoverflow.com/a/21565284/7689902) – light souls Mar 15 '17 at 13:01