dimanche 11 mai 2014

Rejoignez - combiner deux Tables SQL - Stack Overflow


Join both the tables and get first table data and second table data which is missing in Table1 by comparing on Col1 and Col11 I guess. As all the ID's (Col1 and Col11) should come together


Table1


Col1      Col2            Col3                  Col4      Col5            Col6 
1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518

Table2


Col11        Col22         Col33                  
1345653 330760137950 2012-07-09 21:40:29
1345653 110909316904 2012-07-09 21:29:06
1345653 221065796761 2012-07-09 19:31:48
1345653 **150851771618** 2012-07-09 18:57:33

If you look above two tables data, last line in Table2 means Col22-150851771618 is missing in Table1. So I need to display Table1 full data and last line from Table2 as Col22 is missing in Table1 by joining on Col1 and Col11, like this below output.


1345653   330760137950    2012-07-09 21:40:29   1345653   331760137950    1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518
1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL

How can I do this using JOIN by joining on Col1 and Col11? I am having lot of confusion on this. Can anyone help me?


Update:- Some more scenarios


Table1


Col1            Col2            Col3                   Col4       Col5                Col6
1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518

704318001 320941581940 2012-07-09 14:44:48 704318001 321941581940 1341870288

Table2


Col11        Col22         Col33                   Col44   Col55   Col66
1345653 330760137950 2012-07-09 21:40:29 NULL NULL NULL
1345653 110909316904 2012-07-09 21:29:06 NULL NULL NULL
1345653 221065796761 2012-07-09 19:31:48 NULL NULL NULL
1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL

704318001 **290738585064** 2012-07-09 14:36:49 NULL NULL NULL

So Output should be like this- Meaning for this 1345653 ID, I need all record at same place and same with 704318001. So if you look the output, all the 1345653 are together and all 704318001 are together.


1345653   330760137950    2012-07-09 21:40:29   1345653   331760137950    1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518
1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL


704318001 320941581940 2012-07-09 14:44:48 704318001 321941581940 1341870288
704318001 **290738585064** 2012-07-09 14:36:49 NULL NULL NULL

Basically, get the first table full and second table whose data is not there in Table1




A LEFT JOIN should work..


But based on your data, I think you should be joining on Col22 to Col2, since Col1 and Col11 don't have unique values, so I don't know how they are associated.


SELECT t2.Col11, t2.Col22, t2.Col33, t1.Col4, t1.Col5, t1.Col6
FROM
Table2 t2 LEFT JOIN
Table1 t1 ON t1.Col2 = t2.Col22



As I see it you need to add rows from table2 where you cannot find a match on first three columns in table1. You can combine union all and exists to that effect. If the database supports except you might use it instead of exists.


select Col1, Col2, Col3, Col4, Col5, Col6
from table1
union all
select Col11, Col22, Col33, null, null, null
from table2
where not exists (select null
from table1
where table1.col1 = table2.col11
and table1.col2 = table2.col22
and table1.col3 = table2.col33)

UPDATE after clarification: if you can use union all and left join this SQL FIDDLE should help:


select buyer_id, item_id, created_time, user_id, product_id, timestamps
from TestingTable1
union all
select t2.buyer_id, t2.item_id, t2.created_time, null, null, null
from TestingTable2 t2
left join TestingTable1 t1
on t1.buyer_id = t2.buyer_id
and t1.item_id = t2.item_id
-- remove this line if you identify duplicated record
-- by buyer and item only
and t1.created_time = t2.created_time
where t1.buyer_id is null



Why not simply -


SELECT * FROM Table2;

Else please make the question clearer.




I am not really sure, what exactly is the expected output - for example, do you need just a partial outer join or full outer join? assuming you need full outer join and this might do the trick (T-SQL syntax):


select
coalesce(t1.col1, t1.col11),
coalesce(t1.col2, t1.col22),
coalesce(t1.col3, t1.col33),
coalesce(t1.col4, t1.col44),
coalesce(t1.col5, t1.col55),
coalesce(t1.col6, t1.col66),
from
Table1 t1
full outer join Table2 t2 on t2.Col22 = t1.Col2

hope this is what you need. It should join all rows from both Tables on column Col2-Col22 and display for each column pair value from Table1 and if there is a null value it should display value from Table2


edit: you can not join the tables on Col1-Col11. That would in fact produce cartesian product on this example. But may be - depends on real meaning of the data - could be useful join on both Col1=Col11 and Col2=Col22



Join both the tables and get first table data and second table data which is missing in Table1 by comparing on Col1 and Col11 I guess. As all the ID's (Col1 and Col11) should come together


Table1


Col1      Col2            Col3                  Col4      Col5            Col6 
1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518

Table2


Col11        Col22         Col33                  
1345653 330760137950 2012-07-09 21:40:29
1345653 110909316904 2012-07-09 21:29:06
1345653 221065796761 2012-07-09 19:31:48
1345653 **150851771618** 2012-07-09 18:57:33

If you look above two tables data, last line in Table2 means Col22-150851771618 is missing in Table1. So I need to display Table1 full data and last line from Table2 as Col22 is missing in Table1 by joining on Col1 and Col11, like this below output.


1345653   330760137950    2012-07-09 21:40:29   1345653   331760137950    1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518
1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL

How can I do this using JOIN by joining on Col1 and Col11? I am having lot of confusion on this. Can anyone help me?


Update:- Some more scenarios


Table1


Col1            Col2            Col3                   Col4       Col5                Col6
1345653 330760137950 2012-07-09 21:40:29 1345653 331760137950 1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518

704318001 320941581940 2012-07-09 14:44:48 704318001 321941581940 1341870288

Table2


Col11        Col22         Col33                   Col44   Col55   Col66
1345653 330760137950 2012-07-09 21:40:29 NULL NULL NULL
1345653 110909316904 2012-07-09 21:29:06 NULL NULL NULL
1345653 221065796761 2012-07-09 19:31:48 NULL NULL NULL
1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL

704318001 **290738585064** 2012-07-09 14:36:49 NULL NULL NULL

So Output should be like this- Meaning for this 1345653 ID, I need all record at same place and same with 704318001. So if you look the output, all the 1345653 are together and all 704318001 are together.


1345653   330760137950    2012-07-09 21:40:29   1345653   331760137950    1341895229
1345653 110909316904 2012-07-09 21:29:06 1345653 111909316904 1341894546
1345653 221065796761 2012-07-09 19:31:48 1345653 221065796761 1341887518
1345653 **150851771618** 2012-07-09 18:57:33 NULL NULL NULL


704318001 320941581940 2012-07-09 14:44:48 704318001 321941581940 1341870288
704318001 **290738585064** 2012-07-09 14:36:49 NULL NULL NULL

Basically, get the first table full and second table whose data is not there in Table1



A LEFT JOIN should work..


But based on your data, I think you should be joining on Col22 to Col2, since Col1 and Col11 don't have unique values, so I don't know how they are associated.


SELECT t2.Col11, t2.Col22, t2.Col33, t1.Col4, t1.Col5, t1.Col6
FROM
Table2 t2 LEFT JOIN
Table1 t1 ON t1.Col2 = t2.Col22


As I see it you need to add rows from table2 where you cannot find a match on first three columns in table1. You can combine union all and exists to that effect. If the database supports except you might use it instead of exists.


select Col1, Col2, Col3, Col4, Col5, Col6
from table1
union all
select Col11, Col22, Col33, null, null, null
from table2
where not exists (select null
from table1
where table1.col1 = table2.col11
and table1.col2 = table2.col22
and table1.col3 = table2.col33)

UPDATE after clarification: if you can use union all and left join this SQL FIDDLE should help:


select buyer_id, item_id, created_time, user_id, product_id, timestamps
from TestingTable1
union all
select t2.buyer_id, t2.item_id, t2.created_time, null, null, null
from TestingTable2 t2
left join TestingTable1 t1
on t1.buyer_id = t2.buyer_id
and t1.item_id = t2.item_id
-- remove this line if you identify duplicated record
-- by buyer and item only
and t1.created_time = t2.created_time
where t1.buyer_id is null


Why not simply -


SELECT * FROM Table2;

Else please make the question clearer.



I am not really sure, what exactly is the expected output - for example, do you need just a partial outer join or full outer join? assuming you need full outer join and this might do the trick (T-SQL syntax):


select
coalesce(t1.col1, t1.col11),
coalesce(t1.col2, t1.col22),
coalesce(t1.col3, t1.col33),
coalesce(t1.col4, t1.col44),
coalesce(t1.col5, t1.col55),
coalesce(t1.col6, t1.col66),
from
Table1 t1
full outer join Table2 t2 on t2.Col22 = t1.Col2

hope this is what you need. It should join all rows from both Tables on column Col2-Col22 and display for each column pair value from Table1 and if there is a null value it should display value from Table2


edit: you can not join the tables on Col1-Col11. That would in fact produce cartesian product on this example. But may be - depends on real meaning of the data - could be useful join on both Col1=Col11 and Col2=Col22


0 commentaires:

Enregistrer un commentaire