SQL: 跨多个表计算最大日期
SQL: Calculating the Max date across multiple tables
我正在尝试查找跨多个列(在多个表中)的最大日期。我有一个 SQL 查询,我认为它几乎可行,但很难调试它。问题是它从来没有 returns 任何东西。关于我做错了什么的任何想法?我没有收到任何错误,只有一个空行 "maxdate."
这是我的查询:
SELECT
(
SELECT MAX(dates) FROM
(
SELECT dates = t1.UpdateDate
UNION ALL
SELECT dates = t2.UpdateDate
UNION ALL
SELECT dates = t3.UpdateDate
UNION ALL
SELECT dates = t4.UpdateDate
) as dateAcrossColumns
) as maxdate
FROM table1 as t1
join table2 as t2 on t1.ID = t2.ID
join table3 as t3 on t1.ID = t3.ID
join table4 as t4 on t1.ID = t4.ID
join table5 as t5 on t1.Status = t5.Status
WHERE t1.id = @param and t5.status <> 3
首先加入您使用 table 1 的 ID 和 table 3 的 ID 加入 table 2。我猜你是指 table 1 的 ID 和 table 2 的 ID?
join table2 as t2 on t1.ID = t3.ID
应该是:
join table2 as t2 on t1.ID = t2.ID
现已更改;
我试过你的查询并且它工作正常,你确定你的连接带回了任何行吗?要测试它,请将您的 SELECT
语句替换为 SELECT *
,如果您没有返回任何行,那么它们将在您的连接/WHERE
.
中的某处被过滤掉
如果任何表都可能没有给定@param 的任何行,(内部)连接将过滤掉所有其他表。
尝试合并日期并获取并集的最大值
WITH allDates AS (
SELECT UpdateDate
FROM Table1
WHERE ID = @param
UNION
SELECT UpdateDate
FROM Table2
WHERE ID = @param
UNION
SELECT UpdateDate
FROM Table3
WHERE ID = @param
UNION
SELECT UpdateDate
FROM Table4
WHERE ID = @param
UNION
SELECT t5.UpdateDate
FROM Table5 AS t5
JOIN Table1 AS t1
ON t5.Status = t1.Status
WHERE t1.ID = @param
)
SELECT MAX( UpdateDate ) AS MaxDate
FROM allDates
想不出更简单的方法:)
SELECT MAX(Dates) AS RequiredDate
FROM (
SELECT t1.UpdateDate AS DateOne
,t2.UpdateDate AS DateTwo
,t3.UpdateDate AS DateThree
,t4.UpdateDate AS DateFour
FROM table1 as t1
join table2 as t2 on t1.ID = t2.ID
join table3 as t3 on t1.ID = t3.ID
join table4 as t4 on t1.ID = t4.ID
join table5 as t5 on t1.[Status] = t5.[Status]
WHERE t1.id = @param and t5.[Status] <> 3
)t
UNPIVOT (Dates FOR DateCols
IN (DateOne, DateTwo,DateThree,DateFour))up
我试图解决一个类似的问题,以在 MySQL 中的一组连接表中查找最后修改日期。以下使用 GREATEST
和 MAX
的组合对我有用:
SELECT GREATEST(MAX(t1.modified), MAX(t2.modified), MAX(t3.modified),
MAX(t4.modified)) AS lastmodified
FROM `table1` AS t1
LEFT JOIN `table2` AS t2 ON t1.id = t2.t1_id
LEFT JOIN `table3` AS t3 ON t2.id = t3.t2_id
LEFT JOIN `table4` AS t4 ON t3.id = t4.t3_id
WHERE t1.id = @param
我正在尝试查找跨多个列(在多个表中)的最大日期。我有一个 SQL 查询,我认为它几乎可行,但很难调试它。问题是它从来没有 returns 任何东西。关于我做错了什么的任何想法?我没有收到任何错误,只有一个空行 "maxdate."
这是我的查询:
SELECT
(
SELECT MAX(dates) FROM
(
SELECT dates = t1.UpdateDate
UNION ALL
SELECT dates = t2.UpdateDate
UNION ALL
SELECT dates = t3.UpdateDate
UNION ALL
SELECT dates = t4.UpdateDate
) as dateAcrossColumns
) as maxdate
FROM table1 as t1
join table2 as t2 on t1.ID = t2.ID
join table3 as t3 on t1.ID = t3.ID
join table4 as t4 on t1.ID = t4.ID
join table5 as t5 on t1.Status = t5.Status
WHERE t1.id = @param and t5.status <> 3
首先加入您使用 table 1 的 ID 和 table 3 的 ID 加入 table 2。我猜你是指 table 1 的 ID 和 table 2 的 ID?
join table2 as t2 on t1.ID = t3.ID
应该是:
join table2 as t2 on t1.ID = t2.ID
现已更改;
我试过你的查询并且它工作正常,你确定你的连接带回了任何行吗?要测试它,请将您的 SELECT
语句替换为 SELECT *
,如果您没有返回任何行,那么它们将在您的连接/WHERE
.
如果任何表都可能没有给定@param 的任何行,(内部)连接将过滤掉所有其他表。
尝试合并日期并获取并集的最大值
WITH allDates AS (
SELECT UpdateDate
FROM Table1
WHERE ID = @param
UNION
SELECT UpdateDate
FROM Table2
WHERE ID = @param
UNION
SELECT UpdateDate
FROM Table3
WHERE ID = @param
UNION
SELECT UpdateDate
FROM Table4
WHERE ID = @param
UNION
SELECT t5.UpdateDate
FROM Table5 AS t5
JOIN Table1 AS t1
ON t5.Status = t1.Status
WHERE t1.ID = @param
)
SELECT MAX( UpdateDate ) AS MaxDate
FROM allDates
想不出更简单的方法:)
SELECT MAX(Dates) AS RequiredDate
FROM (
SELECT t1.UpdateDate AS DateOne
,t2.UpdateDate AS DateTwo
,t3.UpdateDate AS DateThree
,t4.UpdateDate AS DateFour
FROM table1 as t1
join table2 as t2 on t1.ID = t2.ID
join table3 as t3 on t1.ID = t3.ID
join table4 as t4 on t1.ID = t4.ID
join table5 as t5 on t1.[Status] = t5.[Status]
WHERE t1.id = @param and t5.[Status] <> 3
)t
UNPIVOT (Dates FOR DateCols
IN (DateOne, DateTwo,DateThree,DateFour))up
我试图解决一个类似的问题,以在 MySQL 中的一组连接表中查找最后修改日期。以下使用 GREATEST
和 MAX
的组合对我有用:
SELECT GREATEST(MAX(t1.modified), MAX(t2.modified), MAX(t3.modified),
MAX(t4.modified)) AS lastmodified
FROM `table1` AS t1
LEFT JOIN `table2` AS t2 ON t1.id = t2.t1_id
LEFT JOIN `table3` AS t3 ON t2.id = t3.t2_id
LEFT JOIN `table4` AS t4 ON t3.id = t4.t3_id
WHERE t1.id = @param