选择与另一个表格不同的记录/计数
问题描述:
我正在使用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进行打包。
任何人都可以告诉我吗? 谢谢。
答
你只需要一个OUTER JOIN
(通常缩写为LEFT JOIN
或RIGHT 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
性能问题,是因为你的循环。我们在这里看不到足以理解为什么你需要首先循环。我会建议重新处理你的应用程序来处理集合,而不是一遍又一遍地循环查询。 – 2015-03-31 18:35:11
最初,我们刚刚返回了预定的游戏列表。因此,我们使用来显示上面第一条SQL语句返回的记录。现在,管理员想要查看哪些游戏已分配了统计信息。我们有另一个名为gamestats的表,我们使用schedule列表中的gameid存储统计信息。所以,我希望有一种方法可以只修改第一个SQL语句,以便在gamestats表中检查gameid。当你说'处理套件'时,我不确定你的意思。 –
TCJ
2015-03-31 18:45:45