2015-03-31 90 views
0

我正在使用coldfusion和SQL服務器來管理一些曲棍球統計信息。我有一個表現不佳的SQL查詢,因爲我在返回結果的實際循環內運行另一個查詢。我知道這是不好的,表現也是滯後的。所以我希望有人能幫助我做到這一點。選擇與另一個表格不同的記錄/計數

我的第一個SQL是這樣的:

SELECT 
    S.GameID, 
    S.LeagueID, 
    S.SeasonID, 
    S.DatePlayed, 
    S.TimePlayed, 
    S.HomeTeamID, 
    S.VisitorTeamID, 
    HomeTeam.TeamName AS HomeTeamName, 
    VisitorTeam.TeamName AS VisitorTeamName 
    FROM schedules S 
    JOIN teams AS HomeTeam ON S.HomeTeamID = HomeTeam.TeamID 
    JOIN teams AS VisitorTeam ON S.VisitorTeamID = VisitorTeam.TeamID 
    WHERE S.LeagueID = <cfqueryparam value="#application.leagueid#" cfsqltype="cf_sql_integer"> 
    AND S.SeasonID = <cfqueryparam value="#application.seasonid#" cfsqltype="cf_sql_integer"> 
    ORDER BY S.GameID DESC 

這將運行非常快,我們都好這一點。但是,管理員想要顯示哪些預定的遊戲具有分配給他們的統計信息。所以我cfoutput查詢和循環內,我運行另一個查詢,使用gameid檢查gamestats表。

<cfoutput query="qListGames"> 
    *** table stuff here... 
    <cfquery name="qCheckStats" datasource="#APPICATION.DSN#"> 
    SELECT GameID 
    FROM dbo.GameStats 
    WHERE GameID = #qListGames.GameID# 
    </cfquery> 
    <cfif IsDefined("qAssigned.RecordCount") AND qAssigned.RecordCount GT "0"> 
    True 
    <cfelse> 
    False 
    </cfif> 
    </cfoutput> 

這當然會導致嚴重的滯後,因爲有100多條記錄,我一遍又一遍地敲擊數據庫。理想情況下,我希望運行一個可以收集所有需要顯示的記錄的SQL語句,但還要檢查gamestats表中的相關記錄。如果發現gamestats,我需要顯示true,否則顯示false。我無法圍繞實現這一目標所需的SQL進行打包。

任何人都可以告訴我嗎? 謝謝。

+0

性能問題,是因爲你的循環。我們在這裏看不到足以理解爲什麼你需要首先循環。我會建議重新處理你的應用程序來處理集合,而不是一遍又一遍地循環查詢。 – 2015-03-31 18:35:11

+0

最初,我們剛剛返回了預定的遊戲列表。因此,我們使用來顯示上面第一條SQL語句返回的記錄。現在,管理員想要查看哪些遊戲已分配了統計信息。我們有另一個名爲gamestats的表,我們使用schedule列表中的gameid存儲統計信息。所以,我希望有一種方法可以只修改第一個SQL語句,以便在gamestats表中檢查gameid。當你說'處理套件'時,我不確定你的意思。 – TCJ 2015-03-31 18:45:45

回答

4

你只需要一個OUTER JOIN(通常縮寫爲LEFT JOINRIGHT JOIN)到GameStats表。有幾種方法可以獲取數據;您可以使用列別名選擇GameStats.GameID(以避免與Schedules.GameID衝突),並檢查它是否爲空或在您的cfoutput中有值。或者你可以選擇需要直接在您的查詢的輸出,並從完全循環刪除邏輯:

SELECT 
    S.GameID, 
    S.LeagueID, 
    S.SeasonID, 
    S.DatePlayed, 
    S.TimePlayed, 
    S.HomeTeamID, 
    S.VisitorTeamID, 
    HomeTeam.TeamName AS HomeTeamName, 
    VisitorTeam.TeamName AS VisitorTeamName, 
    CASE WHEN gs.GameID IS NULL THEN 'False' ELSE 'True' END AS HasGameStats 
FROM schedules S 
INNER JOIN teams AS HomeTeam ON S.HomeTeamID = HomeTeam.TeamID 
INNER JOIN teams AS VisitorTeam ON S.VisitorTeamID = VisitorTeam.TeamID 
    LEFT JOIN GameStats gs ON s.GameID = gs.GameID 
WHERE S.LeagueID = <cfqueryparam value="#application.leagueid#" cfsqltype="cf_sql_integer"> 
    AND S.SeasonID = <cfqueryparam value="#application.seasonid#" cfsqltype="cf_sql_integer"> 
ORDER BY S.GameID DESC 
+0

這很完美。我只是跑了查詢,並且完全按照預期在一秒鐘之內完成。它也允許我從循環中刪除邏輯。非常感謝你。我從中看到了很多東西。 – TCJ 2015-03-31 18:54:05

+0

很高興我能提供幫助,尤其是在學到東西的時候。 – dartonw 2015-03-31 18:59:03

相關問題