繁体   English   中英

选择与另一个表不同的记录/计数

[英]Select records / count distinct from another table

我正在使用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表中查找相关记录。 如果找到gamestats,我需要显示为true;否则,请显示false。 我无法全神贯注于实现此目标所需的SQL。

谁能告诉我? 谢谢。

您只需要在GameStats表中使用OUTER JOIN (通常缩写为LEFT JOINRIGHT JOIN )即可。 有几种获取数据的方法。 您可以只使用列别名选择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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM