Sql 选择不同于其他表的记录/计数

Sql 选择不同于其他表的记录/计数,sql,sql-server,coldfusion,Sql,Sql Server,Coldfusion,我正在使用coldfusion和SQL server来管理一些曲棍球统计数据。我有一个SQL查询执行得很差,因为我在返回结果的实际循环中运行了另一个查询。我知道这是不好的,而且表现落后。所以我希望有人能帮我做好这件事 我的第一个SQL如下所示: SELECT S.GameID, S.LeagueID, S.SeasonID, S.DatePlayed, S.TimePlayed, S.HomeTeamID, S.Visito

我正在使用coldfusion和SQL server来管理一些曲棍球统计数据。我有一个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
这运行得很快,我们对此很在行。但是管理员希望显示哪些预定的游戏有分配给他们的统计数据。因此,我输出查询,并在循环中运行另一个查询,该查询使用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表中的相关记录。如果游戏统计数据被找到,我需要显示true;如果没有,我需要显示false。我无法对实现这一点所需的SQL进行思考

有人能给我建议吗? 谢谢。

您只需要一个外部连接,通常缩写为左连接或右连接到GameStats表。有几种方法可以获取您的数据;您可以使用列别名选择GameStats.GameID,以避免与Schedules.GameID冲突,并检查它是否为null或在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
您只需要一个外部连接(通常缩写为LEFT JOIN或RIGHT JOIN)即可连接到GameStats表。有几种方法可以获取您的数据;您可以使用列别名选择GameStats.GameID,以避免与Schedules.GameID冲突,并检查它是否为null或在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

性能问题是因为您正在循环。我们在这里看的不够多,无法理解为什么首先需要循环。我建议修改你的应用程序来处理集合,而不是一次又一次地循环查询。因此,我们使用显示上面第一条SQL语句返回的记录。现在管理员想看看哪些游戏分配了统计数据。我们有另一个名为gamestats的表,其中使用schedules表中的gameid存储统计数据。因此,我希望有一种方法可以重新编写第一条SQL语句,同时检查gamestats表中的gameid。我不知道你说的“句柄集”是什么意思。性能问题是因为你在循环。我们在这里看的不够多,无法理解为什么首先需要循环。我建议修改你的应用程序来处理集合,而不是一次又一次地循环查询。因此,我们使用显示上面第一条SQL语句返回的记录。现在管理员想看看哪些游戏分配了统计数据。我们有另一个名为gamestats的表,其中使用schedules表中的gameid存储统计数据。因此,我希望有一种方法可以重新编写第一条SQL语句,同时检查gamestats表中的gameid。我不知道你说的“手柄组”是什么意思。那太完美了。我刚刚运行了这个查询,在不到一秒钟的时间里,它完全按照预期的那样运行了。它还允许我从循环中删除逻辑。非常感谢你。我从这件事中学到了很多,太完美了。我刚刚运行了这个查询,在不到一秒钟的时间里,它完全按照预期的那样运行了。它还允许我从循环中删除逻辑。非常感谢你。我从中学到了很多。