SQL Server - Refactor Large Union Query - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующие таблицы:

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 из этой таблицы в качестве имени таблицы в моем запросе объединения или что-то в этом роде?

* Примечание. Я не могу изменить дизайн, так какСобственная база данных *

1 Ответ

0 голосов
/ 10 мая 2018

Да, вы можете использовать таблицу форм. Но вам нужны другие дополнительные структурные изменения, если вы хотите избежать большого запроса UNION.

Так что это зависит от того, насколько гибкой является текущая структура базы данных. Вам разрешено изменять структуру таблиц в вашей базе данных? Если это так, я бы создал одну таблицу для форм, а не несколько таблиц. Предположим, эта таблица будет называться FormCases. Это будет выглядеть так:

CREATE TABLE FormCases (
    ID int NOT NULL PRIMARY KEY,
    FormID int FOREIGN KEY REFERENCES Forms(ID),
    CaseID int FOREIGN KEY REFERENCES Cases(ID),
    Subject varchar
);

INSERT INTO FormCases (ID, FormID, CaseID, Subject)
VALUES
    (1, 1, 1, 'Password Issue'),
    (1, 2, 2, 'Add User'),
    (1, 2, 3, 'Delete User');

Редактировать: только что увидел, что вы не можете изменить базу данных. Тогда вам не повезло, и вам нужно использовать большие запросы UNION. К сожалению.

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