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

Откуда:
Сообщений: 554
Есть 2 таблицы:
create table #t1 (col1 int)
create table #t2 (col2 int, col3 int)

insert into #t1 values (1)
insert into #t2 values (1, 5)
insert into #t2 values (1, 7)
Делаю такой запрос:
select col2, col3
from #t1
left outer join #t2 on #t2.col2 = #t1.col1
Возвращаемый результат, т.е. в один столбец:
Картинка с другого сайта.
Нужен такой результат:
Картинка с другого сайта.
Можно сделать так:
select col1
from
(
select col1, col3
from #t1
left outer join #t2 on #t2.col2 = #t1.col1
)t1
union
select col3
from
(
select col1, col3
from #t1
left outer join #t2 on #t2.col2 = #t1.col1
)t2
Но не будут ли здесь затраты при двойном join-е ?
Таблицы #t1 и #t2 на самом деле очень большие, поэтому нужно обойтись одним join-м при создании одного столбца. Как это можно сделать?
29 окт 09, 19:44    [7858903]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select col2
from #t2
union
select col3
from #t2
29 окт 09, 19:54    [7858937]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
select col1 from #t1
union
select #t2.col3 from #t1 left join #t2 on #t1.col1=#t2.col2;
29 окт 09, 19:55    [7858942]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
`
Guest
...так не делайте первый join
к чему он сдесь??
select col1
from #t1

union

select col3
from
(
select col3
from #t1
left outer join #t2 on #t2.col2 = #t1.col1
)t2
col1        
----------- 
1
5
7
29 окт 09, 19:55    [7858944]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Knyazev Alexey
select col2
from #t2
union
select col3
from #t2
Там LEFT JOIN - значит, col3 может дать и NULL, хотя сам по себе IS NOT NULL
29 окт 09, 19:57    [7858952]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
`
...так не делайте первый join
к чему он сдесь??
select col1
from #t1

union

select col3
from
(
select col3
from #t1
left outer join #t2 on #t2.col2 = #t1.col1
)t2
col1        
----------- 
1
5
7
А derived table зачем?
29 окт 09, 19:58    [7858955]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
`
Guest
iap
...
А derived table зачем?


незачем ))
29 окт 09, 20:01    [7858963]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
blest
Member

Откуда:
Сообщений: 554
Не совсем удачный пример я привел... (
Все дело в том, что #t1 получается выборкой из большой таблицы, примерно так:
select col1
from tbl1
where [xxx] = 'ttt'
поэтому select col1 from #t1 хотелось бы делать один раз
29 окт 09, 20:04    [7858971]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
автор
select col1 from #t1 хотелось бы делать один раз
Попробуйте так:
declare @t1 table (col1 int)
declare @t2 table (col2 int, col3 int)

insert into @t1 values (1)
insert into @t2 values (1, 5)
insert into @t2 values (1, 7)

select col_new=case when r*i=1 then col2 else col3 end
      ,col2,col3 --,r,n.i
from(
select col2, col3, r=row_number()over(partition by col2 order by col3)
from @t1 t1 left join @t2 t2 on t2.col2 = t1.col1
)t
join(select i=1 union all select 2)n on n.i=1 and t.r=1 or n.i=2
Result (col2, col3 из итогового селекта можно выкинуть):
col_newcol2col3
115
515
717
29 окт 09, 21:31    [7859154]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT DISTINCT CASE s.t WHEN 0 THEN #t1.col1 ELSE #t2.col3 END col
FROM (SELECT 0 UNION ALL SELECT 1) s(t) CROSS JOIN
 #t1 LEFT JOIN #t2 ON #t1.col1=#t2.col2;
29 окт 09, 21:54    [7859197]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
blest
#t1 получается выборкой из большой таблицы
кстати, вопрос автору: а сколько строк в t1 и в t2 ?
29 окт 09, 22:03    [7859220]     Ответить | Цитировать Сообщить модератору
 Re: UNION + JOIN  [new]
blest
Member

Откуда:
Сообщений: 554
Ozzy-Osbourne
blest
#t1 получается выборкой из большой таблицы
кстати, вопрос автору: а сколько строк в t1 и в t2 ?


В t1 100-1000, в t2 - 10млн.
29 окт 09, 23:35    [7859455]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить