2015-02-25 2 views
0

У меня есть 3 таблицы, которые я пытаюсь объединить с внутренними соединениями, но по какой-то причине они приводят к кучке повторяющихся результатов. Я разорвал свои волосы, пытаясь понять, что здесь происходит. Ниже таблицы я использую:Повторяющиеся данные, полученные в результате внутреннего соединения

Table:gameday.atbats 

    GameName      Inning num b s o Batter Pitcher  Result 
----------------------------------------------------------------------------------------- 
    gid_2008_09_24_cinmlb_houmlb_1 1 1 2 3 1 457803 150116 Jay Bruce strikes out swinging. 
    gid_2008_09_24_cinmlb_houmlb_1 1 2 1 0 2 433898 150116 Jeff Keppinger lines out to right fielder Hunter Pence. 
    gid_2008_09_24_cinmlb_houmlb_1 1 3 3 1 2 458015 150116 Joey Votto singles on a line drive to right fielder Hunter Pence. 
    gid_2008_09_24_cinmlb_houmlb_1 1 4 2 3 3 429665 150116 Edwin Encarnacion called out on strikes. 
    gid_2008_09_24_cinmlb_houmlb_1 1 5 1 2 0 430565 459371 Kazuo Matsui singles on a line drive to right fielder Jay Bruce. 
----------------------------------------------------------------------------------------- 

Table: Gameday.pitches 
GameName     GameAtBatID  Result 
------------------------------------------------------ 
gid_2008_09_24_cinmlb_houmlb_1 1  Called Strike 
gid_2008_09_24_cinmlb_houmlb_1 1  Ball 
gid_2008_09_24_cinmlb_houmlb_1 1  Swinging Strike 
gid_2008_09_24_cinmlb_houmlb_1 1  Ball 
gid_2008_09_24_cinmlb_houmlb_1 1  Foul 
gid_2008_09_24_cinmlb_houmlb_1 1  Foul 
gid_2008_09_24_cinmlb_houmlb_1 1  Swinging Strike 
gid_2008_09_24_cinmlb_houmlb_1 2  Ball 
gid_2008_09_24_cinmlb_houmlb_1 2  In play, out(s) 
gid_2008_09_24_cinmlb_houmlb_1 3  Called Strike 
gid_2008_09_24_cinmlb_houmlb_1 3  Ball 
-------------------------------------------------------- 

Table:batters 
    GameName      id   name_display_first_last 
---------------------------------------------------------------------------------- 
gid_2008_09_24_cinmlb_houmlb_1 407783  Geoff Geary 
gid_2008_09_24_cinmlb_houmlb_1 209315  David Newhan 
gid_2008_09_24_cinmlb_houmlb_1 115629  LaTroy Hawkins 
gid_2008_09_24_cinmlb_houmlb_1 113889  Darin Erstad 
gid_2008_09_24_cinmlb_houmlb_1 457803  Jay Bruce 
gid_2008_09_24_cinmlb_houmlb_1 433898  Jeff Keppinger 
gid_2008_09_24_cinmlb_houmlb_1 458015  Joey Votto 
gid_2008_09_24_cinmlb_houmlb_1 429665  Edwin Encarnacion 
--------------------------------------------------------------------------- 

код я использую выглядит следующим образом:

SELECT gameday.atbats.event 
     , gameday.atbats.inning 
     , gameday.batters.name_display_first_last 
     , gameday.pitchers.name_display_first_last 
     , gameday.pitches.result 
     FROM gameday.atbats 
inner join gameday.pitches on gameday.atbats.num = gameday.pitches.gameAtBatID 
          and gameday.pitches.gamename=gameday.atbats.gamename 
inner join gameday.batters on gameday.atbats.batter = gameday.batters.ID 
          AND gameday.atbats.gamename = gameday.batters.gameName 
    where gameday.atbats.gamename = "gid_2008_09_24_cinmlb_houmlb_1" 

текущие результаты кода в каждого игрока удвоенных свои результаты, например, если первый кляре в игре должны были вычеркнуть по 3 смолы, тогда текущий код выведет, что тесто вычеркивает дважды в первом тайма на 6 смол. Я присоединяюсь к ID игры и идентификаторам из каждой таблицы, но, похоже, все еще есть какая-то проблема.

ответ

1

Не обижайтесь, но мне не нравится ответ «использовать отличный», потому что он просто замаскирует проблему , То, что я делаю в таких случаях, это вставить строку SELECT COUNT(*) прямо над FROM, а затем пошаговое рассмотрение результатов, добавляющих по одной строке за раз; т.е. SELECT COUNT(*) FROM A, затем A JOIN B, затем A JOIN B JOIN C и т. д., чтобы обнаружить нарушение JOIN.

+0

я сузил к этому присоединиться 'внутренний РЕГИСТРИРУЙТЕСЬ gameday.pitches НА gameday.atbats.num = gameday.pitches.gameAtBatID И gameday.pitches.gamename = gameday.atbats.gamename', но я до сих пор не знаете, в чем проблема. Насколько я могу судить, все связано с тем, что должно быть. – Johnny

0

Вы должны добавить это после того, где состояние как

AND gameday.atbats.Id = Gameday.pitches.GameAtBatID  
AND batters.ID = gameday.atbats.batters 
0

В запросе В последней строке вы написали где состояние с именем игры, так это название игры уникальным, если это не так, то вы получите несколько ответов, так что лучший способ использовать первичный ключ в том, где условие вашей таблицы gameday.atbats.

Смежные вопросы