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

Откуда:
Сообщений: 10
Здравствуйте, форумчане, подскажите, пожалуйста, что не так делаю

пример:
declare @t1 table(id int,
priority int,
x1 real,
y1 real)

declare @t2 table(id int,
priority int,
x2 real,
y2 real,
t1 int)

insert into @t1 values (1,1,100,200)
insert into @t1 values (1,2,100,200)
insert into @t1 values (1,null,null,null)
insert into @t1 values (2,2,110,220)
insert into @t1 values (3,null,400,800)

insert into @t2 values (100,1,6,6,1)
insert into @t2 values (200,2,5,5,1)
insert into @t2 values (300,null,7,7,1)
insert into @t2 values (400,3,null,null,3)

select t2.id, x1, y1 from @t1 t1 right join @t2 t2
on (ISNULL(t1.Priority, '-1') = ISNULL(t2.Priority, '-1')
or t1.Priority IS NULL)
and t1.id=t2.t1
order by t2.id

Связываются две таблицы, но в результате происходит задвоение записей
Результат:
id x1 y1
100 100 200
100 NULL NULL
200 100 200
200 NULL NULL
300 NULL NULL
400 400 800

Как избавиться от задвоения, при этом не потеряв остальную инфу?
Заранее спасибо!
6 июн 12, 15:21    [12675380]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Gustav
Как избавиться от задвоения, при этом не потеряв остальную инфу?

Напишите лучше, какой результат из этих таблиц вы хотите получить.
6 июн 12, 15:30    [12675502]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Gustav
Member

Откуда:
Сообщений: 10
Glory,
вот такой
100 100 200
200 100 200
300 NULL NULL
400 400 800
6 июн 12, 16:03    [12675991]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Gustav
Glory,
вот такой

Словами
6 июн 12, 16:17    [12676112]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
SunJun
Member

Откуда:
Сообщений: 135
я думаю вы не поняли суть right join. вам нужен inner join
6 июн 12, 16:28    [12676230]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Gustav
Member

Откуда:
Сообщений: 10
Glory,
ок,
есть много таблиц, но упростим до двух, итак, две таблицы, которые между собой связаны по двум полям, при этом значение в поле Priority в одной из таблиц возможно
NULL-ое (в моем примере таблица t1), мне нужно выбрать все данные, у которых связь есть по обоим полям (ISNULL(t1.Priority, '-1') = ISNULL(t2.Priority, '-1')) и еще подцепить как-то данные у которых поле Priority пустое (or t1.Priority IS NULL).
Все это работает, но с задвоением данных, что видно в результатах запроса. Возможно проблема в операторе ИЛИ, оно ведь не исключающее, но попытки переписать запрос ничего не дают, либо пропадают вместе с задвоенными строками данные с Priority IS NULL, либо пропадают данные, где связь по двум полям, возможно я что-то фундаментальное упускаю, я не знаю. С Union писать бы не хотелось.
6 июн 12, 16:43    [12676360]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы хотите выбрать все записи из @t2 и для каждой только одну какую-то запись из @t1 ?
6 июн 12, 17:18    [12676752]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Gustav
Member

Откуда:
Сообщений: 10
Glory,
ну да, как-то так
7 июн 12, 10:07    [12679597]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
select t2.id,t1.x1,t1.y1
from	@t2 t2
		outer apply(select top 1 t1.x1,t1.y1
					from @t1 t1 
					where	t1.id = t2.t1 
                            and  (t1.priority = t2.priority or t1.priority is null)
                    order by t1.x1 desc        ) t1
                            


или так
select top 1 with ties t2.id, x1, y1 
from @t1 t1 
	right join @t2 t2
	on (t1.Priority = t2.Priority
			or t1.Priority IS NULL)
		and t1.id=t2.t1
order by ROW_NUMBER()over (partition by t2.id order by x1 desc)    
7 июн 12, 10:49    [12680018]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Gustav
Member

Откуда:
Сообщений: 10
Мистер Хенки,
спасибо за предложенные решения,
все отлично работает, но у меня 2000 сервер, поэтому все отлично работает в любой другой версии)))
2000 и на первый, и на второй вариант плюется ошибками.
7 июн 12, 12:01    [12680812]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
Для 2000:

select t2.id ,
(select top 1 t1.x1
		        from @t1 t1 
		        where	t1.id = t2.t1 
                              and  (t1.priority = t2.priority or t1.priority is null)
            order by t1.x1 desc),
(select top 1 t1.y1
		        from @t1 t1 
		        where	t1.id = t2.t1 
                              and  (t1.priority = t2.priority or t1.priority is null)
            order by t1.x1 desc)

from @t2 t2
7 июн 12, 16:33    [12683327]     Ответить | Цитировать Сообщить модератору
 Re: Right Join  [new]
Gustav
Member

Откуда:
Сообщений: 10
Дмитрий_sql,
спасибо вам большое, все работает как надо)))
8 июн 12, 09:40    [12685452]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить