Есть ли быстрое исправление синтаксической ошибки в моей операции JOIN? - PullRequest
1 голос
/ 12 мая 2019

Я довольно новичок в SQL и, возможно, мне это не по вкусу, но я постоянно сталкиваюсь с синтаксической ошибкой в ​​своем операторе соединения.

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

SELECT CHARACTER.CharacterName, CHARACTER.Alignment, INVENTORY.Equipped, 
ITEMS.ItemName,
ITEMS.PhysDef, ITEMS.MDef, ITEMS.Dodge, ITEMS.Damage, ITEMS.CritMultiplier, 
ITEMS.Range,
ITEMS.AttackSpeed, JOB_CHARACTER.JobLevel, RACE_CHARACTER.RacialLevel, 
RACE.RaceName, RACE.Strength,
RACE.Skill, RACE.Vitality, RACE.Arcane, RACE.Spirit, RACE.Charisma, 
RACE.Luck, JOB.JobName,
JOB.HP, JOB.AttackBonus, JOB.Agility, JOB.Might, JOB.SpellPower, JOB.Vital, 
JOB.Nimble, JOB.Mental,
JOB.Curese, JOB.SpellCasting, JOB.ManaBase, JOB.ManaType, JOB.Ki, 
SKILLS.Alchemy, SKILLS.Awareness,
SKILLS.Climb, SKILLS.Coach, SKILLS.Construction, SKILLS.Decieve, 
SKILLS.DisarmMechanism,
SKILLS.DiscernTruth, SKILLS.Dishearten, SKILLS.Fly, SKILLS.Forge, 
SKILLS.Gymnastics,SKILLS.Identify,
SKILLS.Leadership, SKILLS.Lore_9Realms, SKILLS.Lore_Alternative, 
SKILLS.Lore_Arcane,
SKILLS.Lore_Arithmancy, SKILLS.Lore_Divine, SKILLS.Lore_Geography, 
SKILLS.Lore_Nature,
SKILLS.Lore_Nobility, SKILLS.Lore_Religion, SKILLS.Lore_Spiritual, 
SKILLS.Medical, 
SKILLS.Performance, SKILLS.Ride, SKILLS.Steal, SKILLS.Stealth, 
SKILLS.Subterfuge,
SKILLS.Swim, SKILLS.Tailor, SKILLS.UseContraption, SKILLS.Wilderness

FROM (((((((CHARACTER INNER JOIN RACE_CHARACTER ON 
CHARACTER.CharacterID=RACE_CHARACTER.CharacterID)
LEFT JOIN JOB_CHARACTER ON CHARACTER.CharacterID=JOB_CHARACTER.CharacterID)
LEFT JOIN INVENTORY ON CHARACTER.CharacterID=INVENTORY.CharacterID)
INNER JOIN INVENTORY ON ITEMS.ItemID =INVENTORY.ItemID)
INNER JOIN JOB ON JOB.JobID=JOB_CHARACTER.JobID)
LEFT JOIN SKILLS ON JOB.JobID=SKILLS.JobID)
INNER JOIN RACE ON RACE.RaceID=RACE_CHARACTER.RaceID)

WHERE  ((CHARACTER.CharacterID)=1) AND ((JOB.JobID)=3) AND 
((RACE.RaceID)=6);

Я ожидаю, что это выведет статистику для этого отдельного персонажа, его имени и навыков, однако в настоящее время он ничего не выводит.

1 Ответ

0 голосов
/ 12 мая 2019

Ваш оператор select получает 8 полей из таблицы ITEMS:

SELECT 
    ...
    ITEMS.ItemName,
    ITEMS.PhysDef, 
    ITEMS.MDef,
    ITEMS.Dodge,
    ITEMS.Damage, 
    ITEMS.CritMultiplier, 
    ITEMS.Range,
    ITEMS.AttackSpeed,
    ...

Однако таблица ITEMS является , а не , на которую ссылается ваше предложение from:

FROM 
    (
        (
            (
                (
                    (
                        (
                            (
                                CHARACTER INNER JOIN RACE_CHARACTER ON 
                                CHARACTER.CharacterID=RACE_CHARACTER.CharacterID
                            )
                            LEFT JOIN JOB_CHARACTER ON 
                            CHARACTER.CharacterID=JOB_CHARACTER.CharacterID
                        )
                        LEFT JOIN INVENTORY ON 
                        CHARACTER.CharacterID=INVENTORY.CharacterID
                    )
                    INNER JOIN INVENTORY ON ----------< INVENTORY table referenced twice
                    ITEMS.ItemID =INVENTORY.ItemID
                )
                INNER JOIN JOB ON 
                JOB.JobID=JOB_CHARACTER.JobID
            )
            LEFT JOIN SKILLS ON 
            JOB.JobID=SKILLS.JobID
        )
        INNER JOIN RACE ON 
        RACE.RaceID=RACE_CHARACTER.RaceID
    )

Я должен представить, что код SQL должен быть изменен на что-то вроде:

SELECT 
    CHARACTER.CharacterName, 
    CHARACTER.Alignment, 
    INVENTORY.Equipped, 
    ITEMS.ItemName,
    ITEMS.PhysDef, 
    ITEMS.MDef,
    ITEMS.Dodge,
    ITEMS.Damage, 
    ITEMS.CritMultiplier, 
    ITEMS.Range,
    ITEMS.AttackSpeed, 
    JOB_CHARACTER.JobLevel,
    RACE_CHARACTER.RacialLevel, 
    RACE.RaceName, 
    RACE.Strength,
    RACE.Skill,
    RACE.Vitality, 
    RACE.Arcane, 
    RACE.Spirit, 
    RACE.Charisma, 
    RACE.Luck,
    JOB.JobName,
    JOB.HP, 
    JOB.AttackBonus, 
    JOB.Agility, 
    JOB.Might, 
    JOB.SpellPower,
    JOB.Vital, 
    JOB.Nimble, 
    JOB.Mental,
    JOB.Curese, 
    JOB.SpellCasting,
    JOB.ManaBase, 
    JOB.ManaType, 
    JOB.Ki, 
    SKILLS.Alchemy, 
    SKILLS.Awareness,
    SKILLS.Climb, 
    SKILLS.Coach, 
    SKILLS.Construction, 
    SKILLS.Decieve, 
    SKILLS.DisarmMechanism,
    SKILLS.DiscernTruth, 
    SKILLS.Dishearten, 
    SKILLS.Fly, 
    SKILLS.Forge, 
    SKILLS.Gymnastics,
    SKILLS.Identify,
    SKILLS.Leadership, 
    SKILLS.Lore_9Realms, 
    SKILLS.Lore_Alternative, 
    SKILLS.Lore_Arcane,
    SKILLS.Lore_Arithmancy, 
    SKILLS.Lore_Divine, 
    SKILLS.Lore_Geography, 
    SKILLS.Lore_Nature,
    SKILLS.Lore_Nobility, 
    SKILLS.Lore_Religion, 
    SKILLS.Lore_Spiritual, 
    SKILLS.Medical, 
    SKILLS.Performance, 
    SKILLS.Ride, 
    SKILLS.Steal, 
    SKILLS.Stealth, 
    SKILLS.Subterfuge,
    SKILLS.Swim, 
    SKILLS.Tailor, 
    SKILLS.UseContraption, 
    SKILLS.Wilderness
FROM 
    (
        (
            (
                (
                    (
                        (
                            (
                                CHARACTER INNER JOIN RACE_CHARACTER ON 
                                CHARACTER.CharacterID=RACE_CHARACTER.CharacterID
                            )
                            LEFT JOIN JOB_CHARACTER ON 
                            CHARACTER.CharacterID=JOB_CHARACTER.CharacterID
                        )
                        LEFT JOIN INVENTORY ON 
                        CHARACTER.CharacterID=INVENTORY.CharacterID
                    )
                    LEFT JOIN ITEMS ON 
                    ITEMS.ItemID =INVENTORY.ItemID
                )
                LEFT JOIN JOB ON 
                JOB.JobID=JOB_CHARACTER.JobID
            )
            LEFT JOIN SKILLS ON 
            JOB.JobID=SKILLS.JobID
        )
        INNER JOIN RACE ON 
        RACE.RaceID=RACE_CHARACTER.RaceID
    )
WHERE 
    CHARACTER.CharacterID = 1 AND
    JOB.JobID = 3 AND 
    RACE.RaceID = 6

Обратите внимание, что я изменил пару inner joins на left joins, потому что если вы используете inner join на столе, который является правым от left join (или слева от right join) , тогда вы получите неоднозначные внешние объединения ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...