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

Откуда:
Сообщений: 7
В Access писал запрос с группировкой и функцией FIRST - все работало. Как только начал работать в MSQuery ответом на попытку выполнить запрос было сообщение, что SQL Server не может найти функцию FIRST. Как переделать, чтоб работало?
вот как было в Access:
SELECT First(RESULT_TABLE.Поле1) AS [Поле11], First(RESULT_TABLE.Поле2) AS [Поле22]
FROM (SELECT ST.Поле1, ST.Поле2
FROM _Справочник_Товары AS ST
ORDER BY ST.Поле1, ST.Поле3) AS RESULT_TABLE
GROUP BY RESULT_TABLE.Поле11, RESULT_TABLE.Поле22
Возможно что то можно исправить с помощью TOP/DISTINCT, но как?
Конкретнее - есть запрос к таблице возвращающий 3 поля (сортировка по 1 и 3 по убыванию) (в результате не уникальные строки) - нужно получить уникальные по 1 полю строки при отборе с сохранением описаной сортировки.
17 авг 09, 15:45    [7547211]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
MIN() MAX() выбирай любой =)
17 авг 09, 15:47    [7547227]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
solomka1985
Member

Откуда:
Сообщений: 7
Konst_One
MIN() MAX() выбирай любой =)

Спасибо.
Но, не всё так просто (оказалось):
Исходная таблица _Справочник_Товары
Поле1| Поле2 | Поле3
1 | Актив | 1
1 | Не Актив | 3
1 | Под Заказ | 2
2 | Под Заказ | 2
2 | Не Актив | 3
3 | Не Актив | 3
3 | Актив | 1
После первого запроса (с FIRST) результат такой:
1 | Актив
2 | Под Заказ
3 | Не Актив
После использования вместо FIRST MIN получил:
1 | Актив
2 | Не Актив
3 | Актив
НО! Хотелось бы видеть результат таким:
1 | Актив
2 | Под Заказ
3 | Актив
(т.е. удалить дубликаты по полю1 при сортировке как во вложенном запросе)
17 авг 09, 16:11    [7547403]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
подзапрос используйте
17 авг 09, 16:14    [7547426]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
vino
Member

Откуда:
Сообщений: 1191
solomka1985, скорее всего здесь для случая 2000го быстрее будет так
SELECT ST.Поле1 AS [Поле11], RESULT_TABLE.Поле2 AS [Поле22]
FROM (SELECT Поле1, max(Поле3) as add_key FROM _Справочник_Товары GROUP BY Поле1) KST
INNER JOIN _Справочник_Товары AS ST ON KST.Поле1 = ST.Поле1 AND KST.add_key = ST.Поле3
ORDER BY ST.Поле1
А если версию сервера уточните, еще интереснее найдутся варианты.
Кстати, а уникальны ли значения в [Поле3] в каждой группе по [Поле3]?
17 авг 09, 17:53    [7548106]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
vino
Member

Откуда:
Сообщений: 1191
так точнее
SELECT ST.Поле1, ST.Поле2
FROM (SELECT Поле1, max(Поле3) as add_key FROM _Справочник_Товары GROUP BY Поле1) KST
INNER JOIN _Справочник_Товары AS ST ON KST.Поле1 = ST.Поле1 AND KST.add_key = ST.Поле3
ORDER BY ST.Поле1
17 авг 09, 17:55    [7548123]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
vino
Member

Откуда:
Сообщений: 1191
И остается важный вопрос - о смысле и уникальности значений [Поле3] в каждой группе по [Поле1]
17 авг 09, 17:57    [7548137]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
solomka1985
Member

Откуда:
Сообщений: 7
vino, спс
я также сделал через вложенный запрос, но пришлось добавить TOP 100 PERCENT, т.к. SQL Server ругался на view без TOP.
SELECT T1.Поле1, ST.Поле2
FROM
(SELECT DISTINCT TOP 100 PERCENT MIN(Поле1) as Поле11, MIN(Поле3) as Поле33
FROM _Справочник_Товары
GROUP BY Поле1) AS T1, _Справочник_Товары ST
WHERE T1.Поле11 = ST.Поле1 AND T1.Поле33 = ST.Поле3;
Может, что не правильно сделал? Кстати почему нельзя использовать вложенные запросы без TOP и чем отличается использование связывания таблиц через INNER JOIN и WHERE? (с теорией знаете ли слабовато, да и с практикой тоже)
По поводу важного вопроса - Поле3 может быть не уникально в группе Поле1 (поэтому использую DISTINCT во вложенном запросе); смысл же в том чтобы определить значение Поле2 для каждого Поле1 без повторений в Поле1, при сортировке по Поле3 (было создано специально для правильной сортировки таблицы, т.к. по Полю2 от А до Я не тот порядок получается (к сожалению)).
18 авг 09, 10:46    [7549914]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
Glory
Member

Откуда:
Сообщений: 104760
solomka1985
vino, спс
я также сделал через вложенный запрос, но пришлось добавить TOP 100 PERCENT, т.к. SQL Server ругался на view без TOP.
SELECT T1.Поле1, ST.Поле2
FROM
(SELECT DISTINCT TOP 100 PERCENT MIN(Поле1) as Поле11, MIN(Поле3) as Поле33
FROM _Справочник_Товары
GROUP BY Поле1) AS T1, _Справочник_Товары ST
WHERE T1.Поле11 = ST.Поле1 AND T1.Поле33 = ST.Поле3;
Может, что не правильно сделал? Кстати почему нельзя использовать вложенные запросы без TOP и чем отличается использование связывания таблиц через INNER JOIN и WHERE? (с теорией знаете ли слабовато, да и с практикой тоже)
По поводу важного вопроса - Поле3 может быть не уникально в группе Поле1 (поэтому использую DISTINCT во вложенном запросе); смысл же в том чтобы определить значение Поле2 для каждого Поле1 без повторений в Поле1, при сортировке по Поле3 (было создано специально для правильной сортировки таблицы, т.к. по Полю2 от А до Я не тот порядок получается (к сожалению)).

Что то вы придумали. Нельзя в подзапросах/представлениях использовать TOP без ORDER BY. Да и то только синтаксически. Потому что при выполнении сервер игнорирует ORDER BY в подзапросах/представлениях
18 авг 09, 10:55    [7549965]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
solomka1985
Member

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

ваша правда.
18 авг 09, 11:30    [7550221]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
Потому что при выполнении сервер игнорирует ORDER BY в подзапросах/представлениях
Не согласен. Это справедливо только для TOP 100 PERCENT в версиях >=90.
В остальных случаях ORDER BY не может игнорироваться, потому что от него зависит, какие записи попадают в TOP.
18 авг 09, 12:05    [7550513]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
vino
Member

Откуда:
Сообщений: 1191
solomka1985, без distinct разве не то же самое, если пары (Поле1,Поле3) уникальны?
SELECT T1.Поле1, ST.Поле2
FROM
(SELECT Поле1, MIN(Поле3) as Поле33
FROM _Справочник_Товары
GROUP BY Поле1) AS T1, _Справочник_Товары ST
WHERE T1.Поле11 = ST.Поле1 AND T1.Поле33 = ST.Поле3;
А если нет уникальности, то distinct в подзапросе все-равно не поможет
18 авг 09, 15:52    [7552268]     Ответить | Цитировать Сообщить модератору
 Re: Аналог FIRST из Access для MSQuery  [new]
vino
Member

Откуда:
Сообщений: 1191
точнее так
SELECT T1.Поле1, ST.Поле2
FROM
(SELECT Поле1, MIN(Поле3) as Поле33
FROM _Справочник_Товары
GROUP BY Поле1) AS T1, _Справочник_Товары ST
WHERE T1.Поле1 = ST.Поле1 AND T1.Поле33 = ST.Поле3
-- я бы еще добавил для наглядности ORDER BY T1.Поле1
18 авг 09, 15:55    [7552296]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить