0

次のようなテーブル EMP があります。

Name  DeptID  
A     1000

B     1000

C     1000

D     3000

E     6000

テーブルには、一意の名前と DeptID 1000、3000、6000 を持つ何千ものレコードがあります。

テーブルから 2000 行をフェッチする必要があります。これは現在、次のクエリを使用して行っています。

select * from EMP where rownum<2001;

今、クエリが DeptID=1000 で可能な最大のレコードを返すように、DeptID=1000 のレコードを優先する必要があるという要件があります。そのため、DeptID=1000 のレコード数が 2000 を超える場合、クエリ応答で DeptID=1000 レコードのみを返します。また、DeptID=1000 のレコード数が 2000 未満、たとえば 500 の場合、クエリはそのような 500 レコードすべてが返されることを確認する必要があり、他の 1500 は ID!=100 のレコードである可能性があります。

4

3 に答える 3

1
Select top 2000 * 
from EMP 
Order by DeptID

tsql ではなく mysql を使用しているtop場合は、代わりに を最後に使用limitします。

于 2012-06-14T18:26:55.537 に答える
1

免責事項: 使用する RDMS を指定しなかったため、MS SQL Server の T-SQL でこれを書きました。

私がこのアイデアを採用したのは、より重要な特定の部門 ID が必要な場合、その部門のすべてのレコードを取得した後、別の部門に移動し、次に別の任意の部門に移動する必要がある場合があるためです。注文。これにより、次のことが可能になります。

DECLARE @DeptOrdering TABLE
(
    DeptId INT,
    SortOrder INT
)

INSERT @DeptOrdering (DeptId, SortOrder)
VALUES
    (1000, 10)
    , (6000, 20)
    , (3000, 30)

SELECT TOP 2000
    E.*
FROM EMP AS E
INNER JOIN @DeptOrdering Ordering
    ON Ordering.DeptId = E.DeptId
ORDER BY Ordering.SortOrder --, Other columns
于 2012-06-14T18:31:49.387 に答える
0

あなたの説明から、最初に DeptID=1000 レコードを選択して、EMP テーブルから上位 2000 レコードを選択する必要があると思います。

この方法では、最大 4000 レコードを保持する結果テーブルが作成され、最初の 2000 レコードには DeptID=1000 レコードが含まれます (2000 以上ある場合)。

IF OBJECT_ID ('EMPResults', 'U') IS NOT NULL
DROP TABLE EMPResults;
GO

(SELECT TOP 2000 * INTO EMPResults FROM EMP WHERE DeptID = 1000)
UNION
(SELECT TOP 2000 * FROM EMP WHERE DeptID <> 1000);
GO

SELECT TOP 2000 *
FROM EMPResults;
GO
于 2012-06-14T19:27:27.653 に答える