我想在表格中创建一个列" starting_pitcher_game_log" for" HomeAway_ID"条件是另一个表中两列的值," FLD_team_ID"和" Away_Team_ID"这样当" FLD_team_ID"和" Away_Team_ID"彼此相等,新列的值应为"离开"当它们彼此不相等时,新列的值应为" Home"。新列的值应该为" Starting_Pitcher"提供游戏站点信息(" Home"或#34; Away")。当前表中的列" starting_pitcher_game_log"。 " FLD_team_ID"列包括起始投手在列" Starting_Pitcher"中确定的团队的值。为...而战。所以,换句话说,我喜欢" Starting_Pitcher"的每一行。列,对应于给定起始投手所参与的不同游戏,以指定游戏的位置," Home"或者"离开",那场比赛。
以下是经过查询的代码,但该列的除了两个值之外的所有值都是" Home"即使一半应该是" Home"一半应该是"离开"
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'然后" AWAY"和" Home"在第3行的条件语句中。
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)
我没有使用事件表中任何引用的字段创建主键,因为我计划将来以不同的方式对查询中引用的列进行排序。
然后我运行此查询来创建列:
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
答案 0 :(得分:0)
在比较字段之前修剪字段。我认为你有一些隐藏的领先或尾随空白。
答案 1 :(得分:0)
表格中有多少条记录?您在UPDATE查询中没有显式连接:我猜测您有一个隐式交叉连接,其中starting_pitcher_game_log中的所有记录都连接到事件中的所有记录。例如,如果每个表中有1000条记录,则查询将处理1000 X 1000条记录。
向UPDATE查询添加显式内部或外部联接
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')
在哪里b。Starting_Pitcher
= g。PIT_ID