У меня есть следующие таблицы:
CREATE TABLE Forms (
ID int NOT NULL PRIMARY KEY,
FormName varchar
);
INSERT INTO Forms (ID, FormName)
VALUES (1, 'Password_Reset_Form'), (2, 'Service_Request_Form');
CREATE TABLE Cases (
ID int NOT NULL PRIMARY KEY,
CreatedDt datetime
);
INSERT INTO Cases (ID, CreatedDt)
VALUES (1, '2018-05-8'), (2, '2018-05-9'), (3, '2018-05-10');
CREATE TABLE Password_Reset_Form (
ID int NOT NULL PRIMARY KEY,
CaseID int FOREIGN KEY REFERENCES Cases(ID),
Subject varchar,
FormName varchar FOREIGN KEY REFERENCES Forms(FormName)
);
INSERT INTO Password_Reset_Form (ID, CaseID, Subject, FormName)
VALUES (1, 1, 'Password Issue', 'Password_Reset_Form');
CREATE TABLE Service_Request_Form (
ID int NOT NULL PRIMARY KEY,
CaseID int FOREIGN KEY REFERENCES Cases(ID),
Subject varchar,
FormName varchar FOREIGN KEY REFERENCES Forms(FormName)
);
INSERT INTO Service_Request_Form (ID, CaseID, Subject, FormName)
VALUES (1, 2, 'Add User', 'Service_Request_Form'), (1, 3, 'Delete User', 'Service_Request_Form');
Когда отправляется каждый тип формы, в таблицу Cases
записывается новый случай, а все данные формы записываются в соответствующую таблицу формы, например, ввышеупомянутый случай или таблица Password_Reset_Form
или таблица Service_Request_Form
.У меня более 400 таких таблиц форм, и каждая из них может содержать разные поля в дополнение к полям CaseID
, Subject
и FormName
.
Я хочу перечислить все формы и количестводел для каждой формы между определенными датами.
Я могу сделать следующее, но мне нужно объединить 100 таблиц
SELECT t2.FormName, COUNT(1) as TotalCases
FROM Cases t1
INNER JOIN (
select CaseID, FormName FROM Password_Reset_Form
union all
select CaseID, FormName FROM Service_Request_Form
/* 400 + more unions */ ) t2
WHERE t1.CreatedDt BETWEEN '2018-05-08' AND '2018-05-10'
GROUP BY t2.FormName
Есть ли способ использовать таблицу Form
, так каку которого уже есть список имен форм, чтобы упростить запрос, т.е. использовать значение FormName
из этой таблицы в качестве имени таблицы в моем запросе объединения или что-то в этом роде?
* Примечание. Я не могу изменить дизайн, так какСобственная база данных *