Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединение двух таблиц / 7 сообщений из 7, страница 1 из 1
21.11.2002, 14:43:08
    #32070784
Alexei Petrakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Пусть есть две таблицы с одинаковой структурой:
Код: plaintext
1.
2.
3.
4.
T1                                  T2
num    qty                          num    qty
 1        10                             1        5 
 2        20                             3        30 

Надо получить выборку вида:
Код: plaintext
1.
2.
3.
 1      15 
 2      20 
 3      30 

То есть, "объединить" таблицы по полю num и суммировать поле qty.
Я придумал два разных решения. Хотелось бы понять, какое из них лучше (быстрее) работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 --1 вариант
 
declare @temp table
(
	num1 int null,
	num2 int null,
	qty int null
)

insert into @temp
select t1.num, t2.num, isnull(t1.qty,  0 )+ isnull(t2.qty,  0 ) 
from t1 full outer join t2 on t1.num = t2.num

select num1, qty from @temp where num1 is not null
union all
select num2, qty from @temp where num2 is not null and num1 is null


 --2 вариант
 
declare @temp2 table
(
	num int null,
	qty int null
)

insert into @temp2
	select * from t1

update t
set t.qty = t.qty + t2.qty
from @temp2 t, t2
where t.num = t2.num

insert into @temp2
	select num, qty from t2
	where num not in (select num from @temp2)

select * from @temp2

Насколько я понимаю план запроса, в первом варианте по разу просматриваются исходные таблицы и два раза промежуточная (уже объединённая), а во втором - шесть просмотров. Получается, что скорость зависит от того, насколько много в двух таблицах повторяющихся значений поля num. Если, к примеру, нет ни одного одинакового, то быстрее второй вариант, а если половина повторяется - то первый. Я прав? Или обе таблицы окажутся в кэше сервера и оба варианта одинаковы (примерно).
ПС: MS SQL 2000
Спасибо.
...
Рейтинг: 0 / 0
21.11.2002, 14:53:24
    #32070796
Oleg F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Может из нужно не объединять а СОЕДИНЯТЬ по общему полю ? Писать запрос и создавать эти две таблиц мне лень, но по-моему Вашу проблему можно решить одним единственным SQL-запросом SELECT с использование LEFT OUTER JOIN двух указанных таблиц и функции ISNULL (чтобы заменять NULL-слагаемое на 0 при суммировании)
...
Рейтинг: 0 / 0
21.11.2002, 14:57:22
    #32070801
Oleg F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Пардон, извиняюсь. Я невнимательно посмотрел содержимое табличек T1 и T2 и результирующей таблички. Тут действительно без FULL OUTER JOIN не обойтись.
...
Рейтинг: 0 / 0
21.11.2002, 15:40:50
    #32070847
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
а чем не подходит

Код: plaintext
1.
2.
3.
select case when t1.num is null then t2.num else t1.num end,
sum(isnull(t1.qty,  0 )+isnull(t2.qty,  0 ))
from t1 full outer join t2 on t1.num = t2.num
group by case when t1.num is null then t2.num else t1.num end
...
Рейтинг: 0 / 0
21.11.2002, 15:51:55
    #32070858
Fedot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Код: plaintext
1.
2.
3.
SELECT CASE 
	WHEN T1.num IS NULL THEN T2.num
	WHEN T1.Num IS NOT NULL THEN T1.num
	END , ISNULL(T1.qty, 0 )+ISNULL(T2.qty, 0 ) FROM T1 FULL OUTER JOIN T2 ON T1.num=T2.num 
...
Рейтинг: 0 / 0
21.11.2002, 15:53:25
    #32070862
Alexei Petrakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Ух ты!
Спасибо, очень даже подходит. Сам не догадался так сделать :(
...
Рейтинг: 0 / 0
21.11.2002, 15:54:56
    #32070865
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
А разве так не проще ?
Код: plaintext
1.
2.
3.
4.
5.
6.
select num, sum(qty) as aty from
(select num, qty from t1
union all
select num, qty from t2
) AS a
group by num
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединение двух таблиц / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]