2012-03-01 65 views
0

我正在使用SQLite數據庫編寫運行競賽的程序,並且必須從完成數據中確定團隊。有學校參加比賽,一個團隊由四所學校(正好四個)組成。一所學校可以有多個團隊。團隊職位由成員職位總數決定。參賽者被存放在一張桌子上,他們的名字和學校名稱均已完成。如何用sql命令查找團隊

可以通過SQL查詢來完成,還是應該在代碼中解決它?

Example: 
pos  name school   pos name  school 
1  person1 foo    1  person1 foo 
2  person2 foo    2  person2 foo 
3  person3 bar    6  person6 foo 
4  person4 bar    8  person8 foo 
5  person5 bar  ->  3  person3 bar 
6  person6 foo    4  person4 bar 
7  person7 bar    5  person5 bar 
8  person8 foo    7  person7 bar 
9  person9 foo 
10  person10 foo 
11  person11 bar 
+0

究竟是4還是> = 4? – 2012-03-01 15:55:45

回答

1

我知道有沒有像ROW_NUMBER()OVER ......在SQLite的,但我不能找到類似於CROSS APPLY什麼東西。

如果有相當於CROSS APPLY的東西,那麼您可以執行以下操作。 (編輯:我注意到要求學校能夠有多個團隊,這個解決方案只適用於每個學校的一個團隊,就我所知,你需要一個遞歸的CTE和ROW_NUMBER,否則---哪些不是SQLite中可據我所知)

如果沒有,那麼你就可能要使用while循環和臨時表來填補這個。如果是這樣的話,那麼使用SQL沒有真正的收益,我會建議去代碼路由。

編輯: 但是,這是臨時表解決方案所要求的。您需要內一段時間,因爲你可以有學校內部的多個團隊(這是我之前曾忽視,使得CROSS APPLY沒有遞歸CTE和ROW_NUMBER,已編輯承認解決方案不起作用)

CREATE TABLE #SchoolList 
    (Id INT IDENTITY(1,1), School VARCHAR(50)) 

INSERT INTO #SchoolList 
SELECT DISTINCT School 
FROM TeamTable 

CREATE TABLE #TeamList 
    (TeamNumber INT IDENTITY(1,1), Pos INT, Name VARCHAR(50), 
     School VARCHAR(50)) 

DECLARE @CurrentSchool VARCHAR(50), @CurrentSchoolPos INT 
DECLARE @CurrentSchoolLookupId INT 
SET @CurrentSchoolId = 1 
WHILE EXISTS (SELECT 1 FROM #SchoolList WHERE Id > @CurrentSchoolLookupId) 
BEGIN 
    SELECT @CurrentSchool = School FROM #SchoolList 
     WHERE Id = @CurrentSchoolLookupId 
    SET @CurrentSchoolPos = SELECT TOP 1 Pos FROM TeamTable 
          WHERE School = @CurrentSchool 
          ORDER BY POS 
    WHILE ISNULL(@CurrentSchoolPos, 0) > 0 
    BEGIN 
     INSERT INTO #TeamList 
     SELECT Pos, Name, School 
     FROM TeamTable 
     WHERE School = @CurrentSchool AND Pos = @CurrentSchoolPos 

     SET @CurrentSchoolPos = SELECT TOP 1 Pos FROM TeamTable 
           WHERE School = @CurrentSchool 
            AND Pos > @CurrentSchoolPos ORDER BY POS 
    END 
    SET @CurrentSchoolLookupId = @CurrentSchoolLookupId + 1 
END 

SELECT * FROM #TeamList 
+0

只是好奇 - 你如何解決這個臨時表? – Luke101 2012-03-01 16:02:28

+0

我剛剛更新了我的答案,並且在實現這個時我意識到CROSS APPLY不起作用。 SQL應該是一種基於SET的語言,因此如前所述,代碼方式會更好,除非您只有SQL才能使用 – 2012-03-01 16:27:50

+0

來執行此操作。另外,如果您喜歡答案,請不要忘記註冊並接受:) – 2012-03-01 16:54:20

0
select pos, name , schoole, count(school) as teamSize 
from tableName 
where teamSize = 4 
groupby(school)