Команда SQL для базы данных PROGRESS - PullRequest
1 голос
/ 06 октября 2009

Пожалуйста, имейте в виду, что я новичок в SQL - я пытаюсь написать команду SQL с объединением в базе данных PROGRESS. Я хотел бы затем выбрать только первую подходящую запись из объединения. Я думал использовать LIMIT, но PROGRESS не поддерживает это. Я думаю, что MIN или TOP тоже подойдут, но с синтаксисом возникнут проблемы. Вот текущий синтаксис:

SELECT esthead_0."k-est-code", estdie_0."estd-size2", estdie_0."k-cmp-no", estdie_0."estd-cal"
  FROM VISION.PUB.estdie estdie_0 
INNER JOIN VISION.PUB.esthead esthead_0 ON estdie_0."k-est-code" = esthead_0."k-est-code"
 WHERE estdie_0."k-cmp-no" = (SELECT MIN("k-cmp-no") 
                                FROM VISION.PUB.estdie estdie_0 )

Это выберет MIN из всей таблицы, но я бы хотел MIN записей, которые объединение возвращает для каждого "k-est-кода".

Ответы [ 2 ]

0 голосов
/ 29 июля 2016

Progress (OE 11.2) поддерживает OFFSET FETCH, которая аналогична LIMIT OFFSET в mysql.

Пример:

SQLExplorer>select FirstName , LastName , EmpNum from pub.employee order by empnum offset 10 rows fetch next 10 rows only;
FirstName                      LastName                                                EmpNum
------------------------------ -------------------------------------------------- -----------
Frank                          Garsen                                                      11
Jenny                          Morris                                                      12
Luke                           Sanders                                                     13
Marcy                          Adams                                                       14
Alex                           Simons                                                      15
Holly                          Atkins                                                      16
Larry                          Barry                                                       17
Jean                           Brady                                                       18
Larry                          Dawsen                                                      19
Dan                            Flanagan                                                    20

Надеюсь, это поможет

0 голосов
/ 18 октября 2011

Чтобы сделать то, что вы делаете, вам нужно использовать функции агрегирования и GROUP BY.

Вот правильный запрос:

SELECT esthead_0."k-est-code", estdie_0."estd-size2", MIN(estdie_0."k-cmp-no") AS k-cmp-no-minimum, estdie_0."estd-cal"
  FROM VISION.PUB.estdie estdie_0 
  INNER JOIN VISION.PUB.esthead esthead_0 ON estdie_0."k-est-code" = esthead_0."k-est-code"
 GROUP BY esthead_0."k-est-code", estdie_0."estd-size2", estdie_0."estd-cal"

Общий синтаксис для добавления запроса GROUP BY / Aggregate:

  1. используйте агрегатную функцию, такую ​​как MIN (), MAX (), AVG (), SUM (), чтобы выбрать, какой столбец вы хотите ... (выберите функцию в зависимости от того, хотите ли вы минимум, максимум и т. Д.). Есть те, которые я перечислил, которые являются стандартными, и часто ваша база данных также дает вам некоторые дополнительные.

  2. Добавьте все остальные выбранные вами столбцы, КРОМЕ тех, что в функции, к GROUP BY в конце вашего запроса.

  3. Ваша GROUP BY должна произойти после вашего WHERE, но до вашего ORDER BY.

  4. Если вы хотите выполнить WHERE-подобную фильтрацию для функции (скажем, вы хотели только k-cmp-no больше 100), вы используете HAVING после группы, например ::

    МИНУТЫ (estdie_0. "K-cmp-no")> 100

Google для функций Group By и Aggregate для получения дополнительной информации об этой концепции SQL. Он работает одинаково во всех базах данных, как и стандартный ANSI SQL. Смотрите эту страницу для более подробного ознакомления с примерами: http://www.w3schools.com/sql/sql_groupby.asp

...