Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как join двух таблиц с разными структурами?  [new]
claims
Member

Откуда:
Сообщений: 21
Есть две таблицы:
tab1
id|name|data
1 |Ivan|3434
2 |Dima|4545

tab2
id|data2|
1|qw
1|sd
1|etc
2|etc

Хочу сделать join такого вида:
id|name|data|tab2.data|tab2.data|tab2.data
1 |Ivan|3434|qw |sd |etc
2 |Dima|4545|etc

Обычный left join получается конечно сделать, но вот такой вариант даже не знаю с чего начать? Буду рад любому совету!
Спасибо!
28 фев 16, 17:20    [18874012]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
claims
Хочу сделать join такого вида:
id|name|data|tab2.data|tab2.data|tab2.data
1 |Ivan|3434|qw |sd |etc
2 |Dima|4545|etc
Это как, у вас получилось 2 строки с разным количеством колонок?
28 фев 16, 17:50    [18874112]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1456
claims,

declare @tbl table (id int, value varchar(255))
declare @tbl2 table (id int, value varchar(255))

insert into @tbl values (1, 'Иван')
insert into @tbl values (2, 'Петр')

insert into @tbl2 values (1, 'sw')
insert into @tbl2 values (1, 'sd')
insert into @tbl2 values (1, 'sc')


insert into @tbl2 values (2, 'sw')


;with X (id, column_id, value) as (
    select id,
           row_number() OVER (partition by id order by id),
		 value
    from @tbl2
)
select t.*,
       (select X.value from X where X.id = t.id and X.column_id = 1),
	  (select X.value from X where X.id = t.id and X.column_id = 2),
	  (select X.value from X where X.id = t.id and X.column_id = 3)
from @tbl t
        
28 фев 16, 22:12    [18875009]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
claims
Member

Откуда:
Сообщений: 21
felix_ff,
Спасибо большое, немного по ковырялся в новой для себя конструкции и всё заработало как просил!
Единственный момент, Очень долго такой запрос выполняется, у меня в tbl2 400000 значений, в tbl1 120000!
Можно его как то оптимизировать? Или это нормальное явление для такого количества записей?

А если тогда не разбивать значения по столбцам, а через ";" поместить в одно поле? Может быстрее будет работать? Подскажите только пожалуйста как это можно реализовать?
1 мар 16, 15:34    [18882909]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
claims
А если тогда не разбивать значения по столбцам, а через ";" поместить в одно поле? Может быстрее будет работать? Подскажите только пожалуйста как это можно реализовать?
Сложение символьных полей в запросе
1 мар 16, 15:43    [18882965]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
;WITH X (id, column_id, value) AS (
    SELECT id, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id), value
    FROM @tbl2
)
SELECT t.*, t2.*
FROM @tbl t
OUTER APPLY (
    SELECT
        x1 = MAX(CASE WHEN X.column_id = 1 THEN X.value END),
        x2 = MAX(CASE WHEN X.column_id = 2 THEN X.value END),
        x3 = MAX(CASE WHEN X.column_id = 3 THEN X.value END)
    FROM X
    WHERE X.id = t.id
) t2

Просто как вариант...

Если медленно работает, то показывайте какие у Вас индексы на таблицах и план выполнения в формате sqlplan
1 мар 16, 15:44    [18882970]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
Glory
Member

Откуда:
Сообщений: 104760
claims
Подскажите только пожалуйста как это можно реализовать?

Зачем вы храните тогда данные в таком виде
tab2
id|data2|
1|qw
1|sd
1|etc
2|etc

если они нужны в таком
tab2
id|data2|
1|qw,sd,etc
2|etc
1 мар 16, 15:46    [18882990]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
claims
Member

Откуда:
Сообщений: 21
AlanDenton
;WITH X (id, column_id, value) AS (
    SELECT id, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id), value
    FROM @tbl2
)
SELECT t.*, t2.*
FROM @tbl t
OUTER APPLY (
    SELECT
        x1 = MAX(CASE WHEN X.column_id = 1 THEN X.value END),
        x2 = MAX(CASE WHEN X.column_id = 2 THEN X.value END),
        x3 = MAX(CASE WHEN X.column_id = 3 THEN X.value END)
    FROM X
    WHERE X.id = t.id
) t2

Просто как вариант...

Если медленно работает, то показывайте какие у Вас индексы на таблицах и план выполнения в формате sqlplan

Спасибо! По пробовал этот вариант, он ещё дольше отрабатывает. Поля по которым сцепляю - string, там номер паспорта в виде 99 99 999999. Id как таковых нет, таблицы "фантастические" конечно...
2 мар 16, 04:10    [18885385]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Если уж так сильно все медленно, то может все же планы выполнения покажите в sqlplan?
2 мар 16, 10:09    [18886012]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1456
AlanDenton,

Вангую что там две таблицы-кучи
2 мар 16, 11:00    [18886325]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
claims
Member

Откуда:
Сообщений: 21
Всё получилось! Сначала запихал все данные в одно поле, а потом просто при джойнил эту таблицу! За минуту выполняется)
У меня в голове нет четкого понимания, какая конструкция будет быстрее отрабатывать, может есть у кого-нибудь статья по теме?)
;with X (id, value) as (
select id,( select id + ',' as 'data()' from tab2 t2 where t1.[id]=t2.[id] for xml path('') )
from dbo.tab2 t1
group by [Тип]
)
select t.*,
from @tbl t
LEFT JOIN X ON t.[id]=X.[id]
2 мар 16, 15:20    [18888005]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Естественно быстрее, потому что операции сортировки (из-за ROW_COUNT) не будет на плане. Чтобы понимать что и как будет работать... план выполнения надо смотреть. Чего Вы так и не показали.

Относительно конструкций язык есть куча разной литературы. Бен-Ган для начинающих весьма хорошо идет.
2 мар 16, 15:35    [18888066]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
* ROW_NUMBER сорри за опечатку

Да и вообще... Как сказал felix_ff может у Вас там эти таблицы HEAP и индексов покрывающих не завезли. В общем случае, если запрос тормозит, то начинать нужно с анализа актуального плана запроса.
2 мар 16, 15:37    [18888074]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
claims
Member

Откуда:
Сообщений: 21
AlanDenton
Если уж так сильно все медленно, то может все же планы выполнения покажите в sqlplan?

А что это?:)
Мои знания sql оставляют желать лучшего, вот наверстываю)
2 мар 16, 15:53    [18888159]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
claims
Member

Откуда:
Сообщений: 21
AlanDenton
* ROW_NUMBER сорри за опечатку

Да и вообще... Как сказал felix_ff может у Вас там эти таблицы HEAP и индексов покрывающих не завезли. В общем случае, если запрос тормозит, то начинать нужно с анализа актуального плана запроса.

Можно пожалуйста по подробней? что за таблицы кучи? Очень хочется все исправить дабы в будущем было проще с ними работать!
2 мар 16, 15:55    [18888170]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
XML-ый формат файла в который сохраняется план выполнения...

http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan
2 мар 16, 15:57    [18888178]     Ответить | Цитировать Сообщить модератору
 Re: Как join двух таблиц с разными структурами?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
claims
что за таблицы кучи?

Таблицы без кластерного индекса. Все это есть в любой книжке по SQL Server для начинающих... во всяком случае у Бен-Гана есть.
2 мар 16, 15:58    [18888184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить