【发布时间】:2015-05-15 12:09:56
【问题描述】:
描述我的问题并不容易。 Task 在不同的时间范围内有不同的子任务。根据每条任务记录(Task表)的日期从子任务表中获取较早的子任务列表。
-
Task表有列T1Date,T1Task Subtask表有列T2Task、T2SubTask、T2DateTable2.T2Task链接到Table1.T1Task
Table2 列出每个任务的所有子任务以及每个子任务的生效日期。
例如:
Table1 记录:
01/17/2015, Task1
02/24/2015, Task1
03/01/2015, Task2
05/01/2015, Task2
在不同的日期总共执行了四个任务。
Table2 记录:
Task1, SubTask1_1, 01/15/2015
Task1, SubTask1_2, 01/15/2015
Task1, SubTask1_3, 01/15/2015
Task1, SubTask1_1, 02/15/2015
Task1, SubTask1_4, 02/15/2015
Task2, SubTask2_1, 01/01/2015
Task2, SubTask2_2, 04/01/2015
Task2, SubTask2_3, 07/01/2015
这意味着Task1 携带子任务 1_1、1_2 和 1_3,如果它发生在 2015 年 1 月 15 日到 2015 年 2 月 14 日之间。并且 Task1 从 2015 年 2 月 15 日及之后更改为子任务 1_1 和 1_4
我需要 SQL 结果:
01/17/2015, Task1, SubTask1_1, 01/15/2015
01/17/2015, Task1, SubTask1_2, 01/15/2015
01/17/2015, Task1, SubTask1_3, 01/15/2015
02/24/2015, Task1, SubTask1_1, 02/15/2015
02/24/2015, Task1, SubTask1_4, 02/15/2015
03/01/2015, Task2, SubTask2_1, 01/01/2015
05/01/2015, Task2, SubTask2_2, 04/01/2015
我可以使用下面的 SQL 来获取带有硬编码日期的最新结果。但是,我不知道如何使用到达记录的 T1Date 来替换下面 SQL 上的#2/1/2015#。
SELECT
T1Date, T1Task, T2SubTask, T2Date
FROM
Table1
INNER JOIN
(SELECT
Table2.T2Task, Table2.T2subTask, MAX(Table2.T2Date) as maxdate
FROM
Table2
WHERE
Table2.T2Date <= #2/1/2015#
GROUP by
T2subtask) AS b ON Table1.T1Task = b.T2Task AND Table2.Date = b.maxdate
【问题讨论】:
-
这是
n-n关系!!!这是您在关系数据库中可以做的最糟糕的事情。 -
这适用于哪个 RDBMS?请添加标签以指定您使用的是
mysql、postgresql、sql-server、oracle还是db2- 或其他完全不同的东西。
标签: sql