2015-03-31 87 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

相关问题