2012-06-14 52 views
0

我有一個表EMP這看起來是這樣的:SQL查詢優先某一列的值

Name DeptID 
A  1000 

B  1000 

C  1000 

D  3000 

E  6000 

表有成千上萬的記錄,具有唯一的名稱和DeptIDs 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

+0

你正在使用什麼樣的數據庫? –

+0

什麼是where條款中提到的'rownum'列? – Bridge

回答

1
Select top 2000 * 
from EMP 
Order by DeptID 

如果你使用的是mysql而不是tsql,那麼你最好使用limit而不是top

1

免責聲明:您沒有指定您使用的RDMS,所以我在T-SQL中爲MS SQL Server編寫了此項。

我按照這個想法去了,因爲如果需要你碰巧有一個更重要的特定部門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 
0

從你的描述,我認爲你需要從EMP表中選擇前2000條記錄,首先選擇DEPTID = 1000條記錄。

此方法創建一個結果表,最多可保存4000條包含DeptID = 1000條記錄(如果有2000條或更多條記錄)的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 
+1

這似乎是一個不太理想的解決方案,因爲您正在爲選擇查詢製作永久表。如果您至少將其更改爲「INTO#EMPResults」並在底部添加「DROP TABLE#EMPResults」,則對我來說似乎更加可行。 –