1

我想在表“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
4

2 回答 2

0

在比较之前修剪字段。我认为你有一些隐藏的前导或尾随空白。

于 2015-12-07T01:30:06.000 回答
0

表中有多少条记录?您在 UPDATE 查询中没有显式连接:我猜您有一个隐式交叉连接,其中starting_pitcher_game_log 中的所有记录都连接到事件中的所有记录。例如,如果每个表中有 1000 条记录,则查询将处理 1000 X 1000 条记录。

向 UPDATE 查询添加显式内部或外部联接

更新 retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g 内部 JOIN ... SET b.HomeAway_ID=IF(g. AWAY_TEAM_ID=g. FLD_TEAM_ID,'Away','Home') WHERE b. Starting_Pitcher=g。PIT_ID

于 2015-12-08T11:33:31.853 回答