我想在表“starting_pitcher_game_log”中为“HomeAway_ID”创建一个列,条件是另一个表中两列的值,“FLD_team_ID”和“Away_Team_ID”,这样当“FLD_team_ID”和“Away_Team_ID”彼此相等时,新列的值应为“Away”,当它们彼此不相等时,新列的值应为“Home”。新列的值应为当前表“starting_pitcher_game_log”中的“Starting_Pitcher”列提供游戏站点信息(“Home”或“Away”)。“FLD_team_ID”列包含在“Starting_Pitcher”列中标识的首发投手所效力的球队的值。所以,换句话说,我
这是查询的代码,但除两个值外,该列的所有值都是“Home”,即使一半应该是“Home”,一半应该是“Away”
ALTER TABLE retrosheet.starting_pitcher_game_log ADD HomeAway_ID VARCHAR (4);
UPDATE retrosheet.starting_pitcher_game_log as b, retrosheet.events as g
SET b.HomeAway_ID = IF(g.`AWAY_TEAM_ID`=g.`FLD_TEAM_ID`,"Away","Home")
WHERE b.`Starting_Pitcher` = g.`PIT_ID`
有人可以就导致此问题的代码可能有什么问题提供一些指导吗?
更新:这是上面原始代码中四个字段的 TRIM 命令的代码
UPDATE events SET PIT_ID = TRIM(PIT_ID)
UPDATE starting_pitcher_game_log SET Starting_Pitcher = TRIM(Starting_Pitcher)
UPDATE events SET AWAY_TEAM_ID = TRIM(AWAY_TEAM_ID)
UPDATE events SET FLD_TEAM_ID = TRIM(FLD_TEAM_ID)
然后,我运行以下代码,尝试使用 CHAR 和 VARCHAR 来获取 HomeAway_ID 的变量类型,并尝试使用“AWAY”和“Home”,然后在第 3 行的条件语句中使用“AWAY”和“Home”。
ALTER TABLE retrosheet.starting_pitcher_game_log ADD COLUMN HomeAway_ID CHAR(4);
UPDATE retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g
SET b.HomeAway_ID=IF(g.`AWAY_TEAM_ID`=g.`FLD_TEAM_ID`,'Away','Home')
WHERE b.`Starting_Pitcher`=g.`PIT_ID`
我被难住了——感觉不应该这么难……它只是不停地处理。
对此的任何帮助将不胜感激。
更新:
我尝试了以下代码,实现了推荐的 INNER JOIN 命令,但处理查询仍然需要很长时间并且尚未完成:
ALTER TABLE retrosheet.starting_pitcher_game_log ADD COLUMN HomeAway_ID CHAR (4);
UPDATE retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g INNER JOIN retrosheet.starting_pitcher_game_log ON g.AWAY_TEAM_ID = g.FLD_TEAM_ID
SET b.HomeAway_ID=IF(g.AWAY_TEAM_ID=g.FLD_TEAM_ID,'Away','Home') WHERE b.Starting_Pitcher=g.PIT_ID
更新:
ALTER TABLE events ADD INDEX (PIT_ID, FLD_TEAM_ID, AWAY_TEAM_ID)
我没有使用 events 表中的任何引用字段创建主键,因为我计划将来以不同的方式对查询中引用的那些列进行排序。
然后我运行这个查询来创建列:
ALTER TABLE retrosheet.starting_pitcher_game_log ADD COLUMN HomeAway_CD CHAR (4);
UPDATE retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g JOIN retrosheet.starting_pitcher_game_log ON g.AWAY_TEAM_ID = g.FLD_TEAM_ID
SET b.HomeAway_CD=IF(g.AWAY_TEAM_ID=g.FLD_TEAM_ID,'Away','Home') WHERE b.Starting_Pitcher = g.PIT_ID
它只会永远持续下去......
索引列以适应查询执行的最佳方式是什么?
正确代码:首先,我索引了表中可以准确/充分生成该新列的最小字段数(我想在其中添加新列 HomeAway_CD):
ALTER TABLE starting_pitcher_game_log ADD INDEX (GAME_ID, Starting_Pitcher);
这是生成该列的代码。在 where 子句中,我自己尝试了“b.GAME_ID=g.GAME_ID”和自己尝试了“b.Starting_Pitcher = g.PIT_ID”,并且每次查询都需要永远。但是,起始投手列和 Game_ID 列都必须从源表链接到目标表:
UPDATE retrosheet.starting_pitcher_game_log AS b,
retrosheet.events AS g
SET b.HomeAway_CD=IF(g.AWAY_TEAM_ID=g.FLD_TEAM_ID,'Away','Home')
WHERE b.GAME_ID=g.GAME_ID
AND b.Starting_Pitcher = g.PIT_ID