Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Несложный запрос  [new]
вопрос от новичка
Guest
Есть, к примеру, таблица
pnameotdel
Фамилия 11Отдел 1
Фамилия 22Отдел 2
Фамилия 23Отдел 2
Фамилия 12Отдел 1
Фамилия 13Отдел 1
Фамилия 21Отдел 2

Надо получить все фамилии, что работают в том же отделе, где работает Фамилия 22
pnameotdel
Фамилия 22Отдел 2
Фамилия 23Отдел 2
Фамилия 21Отдел 2

Тестовые данные
declare @t table (pname varchar(50), otdel varchar(50))
insert @t values ('Проект 11', 'Отдел 1'), ('Проект 12', 'Отдел 1'), ('Проект 13', 'Отдел 1'),
('Проект 21', 'Отдел 2'), ('Проект 22', 'Отдел 2'), ('Проект 23', 'Отдел 2')
Решение
declare @p varchar(50) = 'Проект 22'
select * from @t
where otdel = (select otdel from @t where pname = @p)

Можно ли решить за один проход по таблице, через top 1 with ties или как-то ещё... Хотел, примерно как в популярной теме 8947782, но не вышло.
Версия сервера 2008. Но если можно за один проход для 2012, то приведите, пожалуйста, решение. Пригодится в будущем :)
7 окт 16, 12:08    [19754553]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
_human
Member

Откуда:
Сообщений: 560
вопрос от новичка,

не уверен что будет лучше

select *
from
(
	select 
	q.*
	,count(q.p) over(partition by q.otdel) x
	from
	(
		select 
			*
			,case when pname = @p then 1 end as p
		from @t
	) q
) a
where a.x = 1
7 окт 16, 12:37    [19754751]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
_human
вопрос от новичка,

не уверен что будет лучше

бляха шо обычный селфджоин написать уже религия не позволяет ?
7 окт 16, 12:38    [19754757]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
_human
Member

Откуда:
Сообщений: 560
Maxx,

позволяет
7 окт 16, 12:45    [19754826]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
вопрос от новичка,

declare @t table (pname varchar(50), otdel varchar(50))
insert @t values ('Проект 11', 'Отдел 1'), ('Проект 12', 'Отдел 1'), ('Проект 13', 'Отдел 1'),
('Проект 21', 'Отдел 2'), ('Проект 22', 'Отдел 2'), ('Проект 23', 'Отдел 2')

declare @p varchar(50) = 'Проект 22'
select pname, otdel
from (
	select *, FIRST_value(pname) over(partition by otdel order by case pname when @p then 0 else 1 end) fname
	from @t
)t
where fname = @p


это для 2012 и выше
7 окт 16, 14:39    [19755711]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
вопрос от новичка
Guest
iljy,

спасибо!
7 окт 16, 15:10    [19755977]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
вопрос от новичка,

select pname, otdel 
from 
    (select *,
        max(case when pname = 'Проект 22' then otdel end) over () otdel2
     from @t) a
where 
    otdel2 = otdel
7 окт 16, 15:20    [19756051]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
вопрос от новичка
Guest
WarAnt,

круто!
7 окт 16, 15:55    [19756278]     Ответить | Цитировать Сообщить модератору
 Re: Несложный запрос  [new]
Mairos
Member

Откуда:
Сообщений: 555
вопрос от новичка,
declare @t table (pname varchar(50), otdel varchar(50))
insert @t values ('Проект 11', 'Отдел 1'), ('Проект 12', 'Отдел 1'), ('Проект 13', 'Отдел 1'),
('Проект 21', 'Отдел 2'), ('Проект 22', 'Отдел 2'), ('Проект 23', 'Отдел 2')

select * from @t t 
where exists 
(
	select null from @t where pname = 'Проект 22' and otdel = t.otdel	
)
10 окт 16, 17:14    [19765379]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить