Запрос на объединение нескольких таблиц - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть таблица с именем Entity, которая содержит только ID int в качестве первичного ключа. У меня также есть ряд таблиц задач (Task1, Task2, Task3, ...). Эти таблицы задач имеют ряд отдельных столбцов, но имеют три общих столбца:

  1. столбец time_created datetime2(7) со значением по умолчанию getdate()
  2. свой собственный ID int PK
  3. внешний ключ ID_Entity (который, конечно, является PK таблицы сущностей).
CREATE TABLE [dbo].[Task1]
(
    [ID_Task1] [int] IDENTITY(1,1) NOT NULL,
    [describer] [nvarchar](30) NOT NULL,
    [ID_Entity] [int] NOT NULL,
    [timestamp] [datetime2](7) NOT NULL,
    [individual_task_value] [float] NOT NULL,

    CONSTRAINT [PK_Task1] 
        PRIMARY KEY CLUSTERED ([ID_Task1] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Task1] 
    ADD CONSTRAINT [DF_Task1_timestamp] DEFAULT (GETDATE()) FOR [timestamp]
GO

ALTER TABLE [dbo].[Task1] WITH CHECK 
    ADD CONSTRAINT [FK_Task1_Entity] 
        FOREIGN KEY([ID_Entity]) REFERENCES [dbo].[Entity] ([id])
GO

ALTER TABLE [dbo].[Task1] CHECK CONSTRAINT [FK_Task1_Entity]
GO

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

Можно ли создать один запрос, который объединит все эти таблицы и, таким образом, даст мне для одной сущности свои разные задачи (упорядоченные по дате)?

Скажите, я запрашиваю свою сущность с идентификатором из 1 и получите список всех назначенных ему задач:

+-----------+------------------+-------+---------+
| ID_ENTITY |     DATETIME     | TASK  | TASK_ID |
+-----------+------------------+-------+---------+
|         1 | 2020.03.01 17:30 | task1 |       1 |
|         1 | 2020.03.01 17:40 | task2 |       1 |
|         1 | 2020.03.02 06:30 | task1 |       2 |
|         1 | 2020.03.02 06:31 | task3 |       1 |
|         1 | 2020.03.02 06:32 | task2 |       2 |
|         1 | 2020.03.02 08:32 | task2 |       3 |
+-----------+------------------+-------+---------+

(столбец ID_ENTITY здесь не имеет смысла и только для демонстрации)

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

Простой UNION ALL сделает работу:

select *
from (
  select [ID_Entity], [timestamp], describer, [ID_Task1] as task_id
    from [dbo].[Task1] where [ID_Entity] = 123
  union all 
  select [ID_Entity], [timestamp], describer, [ID_Task2]
    from [dbo].[Task2] where [ID_Entity] = 123
  union all 
  select [ID_Entity], [timestamp], describer, [ID_Task3]
    from [dbo].[Task3] where [ID_Entity] = 123
) x
order by timestamp
1 голос
/ 19 апреля 2020

Ваше описание проблемы для меня выглядит как UNION.

SELECT ID_Entity,  [timestamp], 'Task1' AS Task, [ID_Task1] AS TaskID
FROM Task1
WHERE ID_Entity = 1

UNION ALL

SELECT ID_Entity,  [timestamp], 'Task2' AS Task, [ID_Task2] AS TaskID
FROM Task2
WHERE ID_Entity = 1

UNION ALL

SELECT ID_Entity,  [timestamp], 'Task3' AS Task, [ID_Task3] AS TaskID
FROM Task3
WHERE ID_Entity = 1

UNION ALL

...

ORDER BY [timestamp];
0 голосов
/ 19 апреля 2020

Вы должны написать рекурсивный запрос для этого

...