Как сузить результаты запроса SQL? - PullRequest
0 голосов
/ 21 ноября 2019

Для моего большого проекта класса 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';

РЕДАКТИРОВАТЬ: Вот результаты запроса. Я забыл упомянуть, что некоторые результаты по какой-то причине являются дубликатами, поэтому я открыт для любых предложений по этому вопросу:

enter image description here

Iне могу понять, связана ли проблема с запросом или структурой таблицы. Любая помощь будет высоко ценится.

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