Select 记录/计数不同于另一个 table
Select records / count distinct from another table
我正在使用 coldfusion 和 SQL 服务器来管理一些曲棍球统计数据。我有一个 SQL 查询性能不佳,因为我 运行 实际循环中的另一个查询 return 结果。我知道这不好,而且性能落后。所以我希望有人能帮助我正确地做到这一点。
我的第一个 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 table.
的查询
<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 table 以获得相关记录。如果找到游戏统计信息,我需要显示 true ;如果没有,我需要显示 false 。我无法理解实现这一目标所需的 SQL。
谁能告诉我吗?
谢谢。
您只需要 OUTER JOIN
(通常缩写为 LEFT JOIN
或 RIGHT JOIN
)到 GameStats table。有几种方法可以获取数据;您可以 select GameStats.GameID 使用列别名(以避免与 Schedules.GameID 冲突)并检查它是否为空或在您的 cfoutput
中有值。或者您可以 select 您直接在查询中需要的输出并完全从循环中删除逻辑:
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
我正在使用 coldfusion 和 SQL 服务器来管理一些曲棍球统计数据。我有一个 SQL 查询性能不佳,因为我 运行 实际循环中的另一个查询 return 结果。我知道这不好,而且性能落后。所以我希望有人能帮助我正确地做到这一点。
我的第一个 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 table.
的查询 <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 table 以获得相关记录。如果找到游戏统计信息,我需要显示 true ;如果没有,我需要显示 false 。我无法理解实现这一目标所需的 SQL。
谁能告诉我吗? 谢谢。
您只需要 OUTER JOIN
(通常缩写为 LEFT JOIN
或 RIGHT JOIN
)到 GameStats table。有几种方法可以获取数据;您可以 select GameStats.GameID 使用列别名(以避免与 Schedules.GameID 冲突)并检查它是否为空或在您的 cfoutput
中有值。或者您可以 select 您直接在查询中需要的输出并完全从循环中删除逻辑:
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