1

SQL が初めての私にご容赦ください。PROGRESS データベースに結合して SQL コマンドを作成しようとしています。次に、結合から最初に一致するレコードのみを選択したいと思います。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が選択されますが、「k-est-code」ごとに結合が返すレコードのMINが必要です。

4

2 に答える 2

0

達成していることを行うには、集計関数と 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 のようなフィルタリングを行いたい場合 (たとえば、100 を超える k-cmp-no のみが必要な場合)、group by の後に HAVING を使用します。

    HAVING MIN(estdie_0."k-cmp-no") > 100

この SQL の概念の詳細については、Group By および Aggregate 関数の Google を参照してください。標準の ANSI SQL であるため、すべてのデータベースで同じように機能します。例を含むより詳細な紹介については、このページを参照してください: http://www.w3schools.com/sql/sql_groupby.asp

于 2011-10-18T05:39:50.287 に答える