Для моего большого проекта класса SQL я создаю базу данных на основе классов персонажей в World of Warcraft Classic. 8 рас, 9 классов, 3 спецификации на класс, и каждая спецификация попадает в определенную роль (урон в ближнем бою, урон от заклинаний, лечение, танк, питомец).
Я создал таблицы на основе всего этого и добавил фальшивых игроков, и база данных вышла прекрасно. Моя проблема - запуск запросов. Если я попытаюсь найти только целителей, то в базе данных появятся КАЖДЫЙ Жрец, Паладин, Шаман и Друид, когда мне нужны только персонажи со спецификациями Дисциплины, Святых или Восстановления.
Это мой коддля таблицы классов символов:
CREATE TABLE TOONCLASS (
ClassName Char(10) NOT NULL,
ClassType Char(15) NOT NULL,
ArmorClass Char(10) NOT NULL,
Restriction Char(15) NULL,
CONSTRAINT ClassPK PRIMARY KEY(ClassName),
CONSTRAINT ClassValues CHECK (ClassName IN ('Druid', 'Hunter', 'Mage',
'Paladin', 'Priest', 'Rogue', 'Shaman',
'Warlock', 'Warrior')),
CONSTRAINT ClassType CHECK (ClassType IN ('Melee', 'Spellcaster', 'Hybrid')),
CONSTRAINT TypeGroups CHECK (
(ClassName IN ('Druid', 'Shaman', 'Paladin') AND ClassType = 'Hybrid')
OR (ClassName IN ('Mage', 'Priest', 'Warlock') AND ClassType = 'Spellcaster')
OR (ClassName IN ('Hunter', 'Rogue', 'Warrior') AND ClassType = 'Melee')),
CONSTRAINT ArmorType CHECK (ArmorClass IN ('Cloth', 'Leather', 'Mail', 'Plate')),
CONSTRAINT ArmorGroups CHECK(
(ClassName IN ('Mage', 'Priest', 'Warlock') AND ArmorClass = 'Cloth')
OR (ClassName IN ('Druid', 'Rogue') AND ArmorClass = 'Leather')
OR (ClassName IN ('Hunter', 'Shaman') AND ArmorClass = 'Mail')
OR (ClassName IN ('Paladin', 'Warrior') AND ArmorClass = 'Plate')),
CONSTRAINT ClassRestrict CHECK (Restriction IN ('Alliance Only', 'Horde Only', NULL)),
CONSTRAINT RestrictGroups CHECK (
(ClassName = 'Paladin' AND Restriction = 'Alliance Only')
OR (ClassName = 'Shaman' AND Restriction = 'Horde Only')
OR (Restriction = NULL)),
);
Это мой код для таблицы спецификаций:
CREATE TABLE TOONSPEC(
SpecName Char(20) NOT NULL,
ClassName Char(10) NOT NULL,
SpecRole Char(20) NOT NULL,
CONSTRAINT SpecPK PRIMARY KEY (SpecName),
CONSTRAINT ClassFK FOREIGN KEY (ClassName)
REFERENCES TOONCLASS (ClassName),
CONSTRAINT RoleGroups CHECK (
(SpecName IN ('Discipline', 'Holy(Pa)', 'Holy(Pr)', 'Restoration(Dr)',
'Restoration(Sh)') AND SpecRole = 'Healing')
OR (SpecName IN ('Feral(Cat)', 'Marksmanship', 'Survival', 'Retribution',
'Assassination', 'Outlaw', 'Subtlety', 'Enhancement', 'Arms', 'Fury')
AND SpecRole = 'Melee Damage')
OR (SpecName IN ('Beast Mastery', 'Demonology') AND SpecRole = 'Pet')
OR (SpecName IN ('Balance', 'Arcane', 'Fire', 'Frost', 'Shadow',
'Elemental', 'Affliction', 'Destruction') AND SpecRole = 'Spell Damage')
OR (SpecName IN ('Feral(Bear)', 'Protection(Pa)', 'Protection(Wa)') AND SpecRole = 'Tank')),
CONSTRAINT SpecGroups CHECK(
(SpecName IN ('Balance', 'Feral(Bear)', 'Feral(Cat)', 'Restoration(Dr)') AND ClassName = 'Druid')
OR (SpecName IN ('Beast Mastery', 'Marksmanship', 'Survival') AND ClassName = 'Hunter')
OR (SpecName IN ('Arcane', 'Fire', 'Frost') AND ClassName = 'Mage')
OR (SpecName IN ('Holy(Pa)', 'Protection(Pa)', 'Retribution') AND ClassName = 'Paladin')
OR (SpecName IN ('Discipline', 'Holy(Pr)', 'Shadow') AND ClassName = 'Priest')
OR (SpecName IN ('Assassination', 'Outlaw', 'Subtlety') AND ClassName = 'Rogue')
OR (SpecName IN ('Elemental', 'Enhancement', 'Restoration(Sh)') AND ClassName = 'Shaman')
OR (SpecName IN ('Affliction', 'Demonology', 'Destruction') AND ClassName = 'Warlock')
OR (SpecName IN ('Arms', 'Fury', 'Protection(Wa)') AND ClassName = 'Warrior')),
);
И это мой запрос:
SELECT TOON.ToonName, TOON.CharLevel, TOON.ClassName, TOON.SpecName,
TOONSPEC.SpecRole, TOONRACE.Faction
FROM TOON
INNER JOIN TOONSPEC ON TOON.ClassName=TOONSPEC.ClassName
INNER JOIN TOONRACE ON TOON.Race=TOONRACE.RaceName
WHERE SpecRole = 'Healing';
РЕДАКТИРОВАТЬ: Вот результаты запроса. Я забыл упомянуть, что некоторые результаты по какой-то причине являются дубликатами, поэтому я открыт для любых предложений по этому вопросу:
Iне могу понять, связана ли проблема с запросом или структурой таблицы. Любая помощь будет высоко ценится.