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

Откуда:
Сообщений: 6
SELECT p.FistName, p.LastName FROM dbo.Person AS p
WHERE p.ID IN (SELECT pid FROM
(SELECT PersonID AS pid, COUNT(SkillID) AS [count] FROM dbo.PersonSkills AS ps
GROUP BY PersonID ORDER BY [count] DESC) AS pidt)

проблемма в ORDER BY
23 июн 15, 16:38    [17807666]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
o-o
Guest
Msg 1033, Level 15, State 1, Line 4
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

зачем вообще ORDER BY внутри вашего подзапроса?
какая разница p.ID IN (1,2) или (2,1)?
23 июн 15, 16:43    [17807696]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Кролик-зануда
Guest
dsalodki,
и зачем он Вам там, этот order by?
23 июн 15, 16:44    [17807703]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
o-o
Guest
мама дорогая, да вообще зачем там COUNT,
если всего-то p.id должен быть в dbo.PersonSkills.PersonID
23 июн 15, 16:47    [17807721]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
o-o
Guest
a представляете, если бы сервер был совсем тупой и выполнял все подряд?
хорошо хоть нарастающий итог не заставили посчитать для каждого Person из подзапроса
23 июн 15, 16:50    [17807737]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
А зачем там COUNT()?
Да и один из подзапросов - лишний
23 июн 15, 16:51    [17807741]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

Откуда:
Сообщений: 124
SELECT p.FistName, p.LastName FROM dbo.Person AS p
WHERE p.ID IN (select PersonID from dbo.PersonSkills)
23 июн 15, 17:19    [17807899]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Adony
Member

Откуда: Москва
Сообщений: 1083
Скорее всего, в задаче было что-то типа: вывести ФИО с макс кол-вом скиллз ))
23 июн 15, 17:29    [17807956]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

Откуда:
Сообщений: 124
select top 1 with ties p.FistName, p.LastName  
from dbo.Person p
join  dbo.PersonSkill s 
	on p.ID=s.PersonID
group by s.PersonID
order by COUNT(*) desc
23 июн 15, 17:37    [17808003]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

Откуда:
Сообщений: 124
вернее group by s.PersonID, p.FistName, p.LastName
23 июн 15, 17:40    [17808021]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Gviber
вернее group by s.PersonID, p.FistName, p.LastName
А у персоны ещё и имя с фамилией меняется по ходу дела? ID недостаточно?
23 июн 15, 17:42    [17808034]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

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

Там группировка. Кста давно нужно пролоббировать микрософт, чтобы запихнули SOMEBODY(LastName) наравне с другими агрегатными функциями =)
23 июн 15, 17:49    [17808062]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

Откуда:
Сообщений: 124
наверно так быстрее будет

SELECT p.FistName, p.LastName FROM dbo.Person AS p
WHERE p.ID IN 
(	
	select top 1 with ties PersonID 
	from dbo.PersonSkills 
	group by PersonID 
	order by COUNT(*) desc
)
23 июн 15, 17:55    [17808091]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Gviber
Там группировка.
Зачем?
И как это объясняет COUNT(*), который не используется?
23 июн 15, 21:01    [17808624]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

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

Есть уверенность, что не используется?
23 июн 15, 23:31    [17809004]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Кролик-зануда
Guest
Gviber,

думаю, iap говорит про исходный запрос.
смысл обсуждать Ваш, если неизвестно, что на самом деле нужно ТСу? :)
24 июн 15, 06:49    [17809275]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
dsalodki
Member

Откуда:
Сообщений: 6
нужно вывести людей в порядке в кот больше всего скилов, кол-во скилов можно тоже вывести
24 июн 15, 11:11    [17810189]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Кролик-зануда
Gviber,

думаю, iap говорит про исходный запрос.
Да.
24 июн 15, 11:17    [17810227]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
o-o
Guest
dsalodki
нужно вывести людей в порядке в кот больше всего скилов, кол-во скилов можно тоже вывести

declare @Person table (id int, FistName varchar(100), LastName varchar(100));
declare @PersonSkills table (PersonID int, SkillID int);

insert into @Person values(1, 'vasja', 'vasechkin'), (2, 'petja', 'petechkin'), (3, 'kto-to', 'bez skillov');
insert into @PersonSkills values(1, 1), (1, 2), (2, 3)

SELECT p.FistName, p.LastName, COUNT(ps.SkillID) AS [count] 
FROM @Person p left join @PersonSkills AS ps on p.id = ps.PersonID
GROUP BY p.FistName, p.LastName
ORDER BY [count] DESC;
---
FistName	LastName	count
vasja	vasechkin	2
petja	petechkin	1
kto-to	bez skillov	0
24 июн 15, 11:47    [17810484]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
Gviber
Member

Откуда:
Сообщений: 124
o-o,

Мой запрос правильнее. Т.к. ФИО могут совпадать, а PersonID нет.

Кста совпадающие ФИО не редкость, если 1000 сотрудников в БД то 90% вероятность, что будут одинаковые ФИО (даже с отчеством).
24 июн 15, 11:56    [17810527]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
o-o
Guest
Gviber,

правда при этом ваш запрос всех не выводит вовсе

для педантов
SELECT p.id, p.FistName, p.LastName, COUNT(ps.SkillID) AS [count] 
FROM @Person p left join @PersonSkills AS ps on p.id = ps.PersonID
GROUP BY p.id, p.FistName, p.LastName
ORDER BY [count] DESC;
24 июн 15, 12:22    [17810667]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
dsalodki
Member

Откуда:
Сообщений: 6
o-o,
спасибо, все верно!
24 июн 15, 15:26    [17811815]     Ответить | Цитировать Сообщить модератору
 Re: как переписать запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
o-o
Gviber,

правда при этом ваш запрос всех не выводит вовсе

для педантов
SELECT p.id, p.FistName, p.LastName, COUNT(ps.SkillID) AS [count] 
FROM @Person p left join @PersonSkills AS ps on p.id = ps.PersonID
GROUP BY p.id, p.FistName, p.LastName
ORDER BY [count] DESC;
Кстати, тогда p.FistName и p.LastName можно из GROUP BY убрать,
а в SELECTе вставить их в функцию MIN().
Интуитивно чувствую, что должно стать не хуже :))
24 июн 15, 15:29    [17811831]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить