2015-05-27 2 views
0

таблица испытаний:Объединить и обновление таблицы в SQL

+--------+--------+-------+------+ 
| source | target | count | prob | 
+--------+--------+-------+------+ 
| test1 | test2 |  2 | 1 | 
| cat | dog |  2 | 1 | 
+--------+--------+-------+------+ 

стол test2:

+--------+--------+-------+------+ 
| source | target | count | prob | 
+--------+--------+-------+------+ 
| cat | dog |  1 | 0.5 | 
| dog | cat |  1 | 0.5 | 
+--------+--------+-------+------+ 

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

select test.count+test2.count, test.prob+test.prob 
from test, test2 
where (test.source = test2.source) and (test.target = test2.target); 

, если я хочу обновить тест стол, подобный этому

+--------+--------+-------+------+ 
| source | target | count | prob | 
+--------+--------+-------+------+ 
| test1 | test2 |  2 | 1 | 
| cat | dog |  3 | 1.5| 
| dog | cat |  1 | 0.5| 
+--------+--------+-------+------+ 

Есть ли какие-либо предложения?

ответ

1

Попробуйте Союз с группой.

select source , target , SUM(`count`), SUM(prob) 
(select * from test 
Union 
select * from test2) as t 
group by source,target 
+0

Этот SQL-код имеет некоторые ошибки; –

1

При вставке и обновлении повторяющиеся записи, почему бы не использовать composite key и использовать insert into select from и on duplicate key update

Рассмотрим следующий

create table table1(
    source varchar(100), 
    target varchar(100), 
    `count` int, 
    prob int, 
    primary key(source,target) 
); 

Обратите внимание, что здесь первичный ключ (source,target)

create table table2(
    source varchar(100), 
    target varchar(100), 
    `count` int, 
    prob int 
); 

Позволяет поставить некоторые данные и становится

mysql> select * from table1 ; 
+--------+--------+-------+------+ 
| source | target | count | prob | 
+--------+--------+-------+------+ 
| cat | dog |  2 | 1 | 
| test1 | test2 |  2 | 1 | 
+--------+--------+-------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from table2 ; 
+--------+--------+-------+------+ 
| source | target | count | prob | 
+--------+--------+-------+------+ 
| test1 | test2 |  2 | 1 | 
| cat | dog |  3 | 2 | 
| dog | cat |  1 | 1 | 
+--------+--------+-------+------+ 
3 rows in set (0.00 sec) 

Теперь позволяет написать запрос

insert into table1 
select * from 
(
select * from table2 
)x 
on duplicate key update 
table1.`count` = x.`count` +table1.`count` , 
table1.prob =table1.prob+x.prob ; 

После выполнения вышеупомянутого запроса данных table1 становится

mysql> select * from table1 ; 
+--------+--------+-------+------+ 
| source | target | count | prob | 
+--------+--------+-------+------+ 
| cat | dog |  5 | 3 | 
| dog | cat |  1 | 1 | 
| test1 | test2 |  4 | 2 | 
+--------+--------+-------+------+ 
3 rows in set (0.00 sec) 
+0

это решение просто можно было использовать в этом случае, а не пример ..., это странно .... –

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