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

Откуда:
Сообщений: 170
Добрый день.

Тестовые таблицы.
insert into #tmp1 values (1,'T1'),(1,'T2'),(2,'t3'),(3,'T4')

create table #tmp2 (id int,name varchar(50))
insert into #tmp2 values (1,'T5'),(1,'T6'),(2,'T7'),(3,'T7'),(3,'T8')

select #tmp.id,#tmp1.name as name1,#tmp2.name as name2 from #tmp left join
#tmp1 on #tmp.id=#tmp1.id left join
#tmp2 on #tmp.id=#tmp2.id


Ожидаемый результат
id name1 name2
1 T1 T5
1 T2 T6
2 t3 T7
3 T4 T7
3 NULL T8
4 NULL NULL


Это упрощенный вариант, реально табличек будет больше.
Суть проблемы: мне нужно по ключу собрать вместе данные из нескольких таблиц. Вполне возможно, что на один ключ окажется несколько значений. Значения из других таблиц не должны дублироваться.
12 фев 15, 11:20    [17254436]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
igr_ok
Значения из других таблиц не должны дублироваться.

И как сервер узнает об этом вашем желании ?
12 фев 15, 11:21    [17254445]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
igr_ok
Member

Откуда:
Сообщений: 170
Glory
igr_ok
Значения из других таблиц не должны дублироваться.

И как сервер узнает об этом вашем желании ?
Спасибо за быстрый и бесполезный ответ. Если вы выполните скрипт и сравните его с желаемым результатом, то поймете, что я имел в виду.
12 фев 15, 11:28    [17254511]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Maxx_UA
Guest
igr_ok,

значения для таблицы #tmp - придемать самомму ?
12 фев 15, 11:33    [17254544]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
igr_ok
Спасибо за быстрый и бесполезный ответ. Если вы выполните скрипт и сравните его с желаемым результатом, то поймете, что я имел в виду.

И вам спасибо за умный вопрос
А теперь спросите себя, как сервер будет различать дубли, если вы не указали, как их различать.
А потом соберитесь с мыслями и придумайте, как же вы сами различили дубли и к T1 поставили T5, а к Т2 - Т6. Потом воплотите свои мысли в код
12 фев 15, 11:33    [17254547]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
igr_ok
Glory
пропущено...

И как сервер узнает об этом вашем желании ?
Спасибо за быстрый и бесполезный ответ. Если вы выполните скрипт и сравните его с желаемым результатом, то поймете, что я имел в виду.

А Вы сами сможете быстро выполнить приведенный Вами скрипт в новом окне студии ?
12 фев 15, 11:34    [17254553]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
igr_ok
Member

Откуда:
Сообщений: 170
LexusR
igr_ok
пропущено...
Спасибо за быстрый и бесполезный ответ. Если вы выполните скрипт и сравните его с желаемым результатом, то поймете, что я имел в виду.

А Вы сами сможете быстро выполнить приведенный Вами скрипт в новом окне студии ?
Извиняюсь. Не весь код скопировал
create table #tmp (id int)
insert into #tmp values (1),(2),(3),(4)

create table #tmp1 (id int,name varchar(50))
insert into #tmp1 values (1,'T1'),(1,'T2'),(2,'t3'),(3,'T4')

create table #tmp2 (id int,name varchar(50))
insert into #tmp2 values (1,'T5'),(1,'T6'),(2,'T7'),(3,'T7'),(3,'T8')

select #tmp.id,#tmp1.name as name1,#tmp2.name as name2 from #tmp left join
#tmp1 on #tmp.id=#tmp1.id left join
#tmp2 on #tmp.id=#tmp2.id
12 фев 15, 11:36    [17254580]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
igr_ok
Glory
пропущено...

И как сервер узнает об этом вашем желании ?
Спасибо за быстрый и бесполезный ответ. Если вы выполните скрипт и сравните его с желаемым результатом, то поймете, что я имел в виду.

Можете пояснить нам каким образом сервер должен догадаться, что ему нужно сопоставить

 #tmp1 values (1,'T1')


 #tmp2 values (1,'T5')


Но ни в коем случае

 #tmp1 values (1,'T1')


 #tmp2 values (1,'T6')


Или вы считаете, что у сервера есть опция

SET EXTRASENROR ON


И позвольте дружеский совет: прежде чем обижаться подумайте о то, что вы спрашиваете.
Быстрые и бесполезные советы здесь дают на необдуманные и глупые вопросы.
12 фев 15, 11:38    [17254593]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Добрый Э - Эх
Guest
igr_ok,

используй вложенные джойны, Люк igr_ok:
select #tmp.id,tmp1.name as name1,tmp2.name as name2 
  from #tmp 
  left join (select *, ROW_NUMBER() over(PARTITION by id order by name) as rn from #tmp1) tmp1 
  full join (select *, ROW_NUMBER() over(PARTITION by id order by name) as rn from #tmp2) tmp2 
  on tmp1.id=tmp2.id and tmp1.rn = tmp2.rn
on #tmp.id=coalesce(tmp1.id,tmp2.id)
12 фев 15, 11:58    [17254721]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Добрый Э - Эх
используй вложенные джойны,

А заострять внимание на том, что тут еще создается уникальный ид записей, не будем ?
12 фев 15, 12:04    [17254786]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Добрый Э - Эх
Guest
Glory
Добрый Э - Эх
используй вложенные джойны,

А заострять внимание на том, что тут еще создается уникальный ид записей, не будем ?
это более очевидная и сразу бросающаяся в глаза вещь в запросе. смысл делать акцент на очевидном?
а вот то, что джойны вложенны - не сразу замыленным глазом увидеть можно, на что и было указано...
12 фев 15, 12:09    [17254832]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Добрый Э - Эх
это более очевидная и сразу бросающаяся в глаза вещь в запросе. смысл делать акцент на очевидном?

Для ТС это не очевидно. Скорее даже внезапно. Он то думает, что в join-е есть волшебная опция "значения не должны дублироваться"
12 фев 15, 12:12    [17254850]     Ответить | Цитировать Сообщить модератору
 Re: При join создаются лишние строки  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
if object_id('tempdb..#tmp') is not null drop table #tmp
create table #tmp (id int)
insert into #tmp values (1),(2),(3),(4)

if object_id('tempdb..#tmp1') is not null drop table #tmp1
create table #tmp1 (id int,name varchar(50))
insert into #tmp1 values (1,'T1'),(1,'T2'),(2,'t3'),(3,'T4')

if object_id('tempdb..#tmp2') is not null drop table #tmp2
create table #tmp2 (id int,name varchar(50))
insert into #tmp2 values (1,'T5'),(1,'T6'),(2,'T7'),(3,'T7'),(3,'T8')


;with t1(id,name1,name2,n) as 
(select Id,cast(null as varchar(10)) as name1,cast(null as varchar(10)) as name2,row_number()over(partition by id order by newid()) from #tmp
union select Id,name,null,row_number()over(partition by id order by name) from #tmp1
union select Id,null,name,row_number()over(partition by id order by name) from #tmp2
)select id,min(name1) as name1,min(name2) as name2
 from t1 
 group by id,n
 order by id,n
12 фев 15, 12:23    [17254956]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить