【发布时间】:2017-12-07 22:03:29
【问题描述】:
我有一个特定的要求,后端应该从表中发送符合特定条件的记录。有一个版本表,基本上包含 [id, ..., modstamp, 已删除] 要求是获取时间戳 t1 和 t2 之间匹配的记录。 我想我可以解释一下sql脚本:
create table test (id varchar(10), cv_modstamp DATETIMEOFFSET, sf_deleteddate DATETIMEOFFSET);
insert into test values ('aaa', '2017-10-27 18:45:44 +00:00', null);
insert into test values ('bbb', '2017-10-27 18:45:44 +00:00', NULL);
insert into test values ('eee', '2017-10-27 18:45:44 +00:00', NULL);
insert into test values ('aaa', '2017-10-28 22:45:44 +00:00', NULL);
insert into test values ('bbb', '2017-10-28 22:45:44 +00:00', '2017-10-28 22:45:44 +00:00');
insert into test values ('ccc', '2017-10-28 22:45:44 +00:00', NULL);
insert into test values ('ddd', '2017-10-28 22:45:44 +00:00', '2017-10-28 22:45:44 +00:00');
select * from test;
select D1.*, D2.* from
(
select A.*
FROM TEST A, (SELECT id AS T_ALIAS_ID, MAX(CV_Modstamp) AS T_ALIAS_lastModTime
FROM TEST
WHERE CV_Modstamp <= '2017-11-14 18:45:44 +00:00'
GROUP BY id) T
WHERE A.id = T.T_ALIAS_ID
AND A.CV_Modstamp = T.T_ALIAS_lastModTime
AND A.SF_Deleteddate IS NULL
) D1
INNER JOIN
(
select A.*
FROM TEST A, (SELECT id AS T_ALIAS_ID, MAX(CV_Modstamp) AS T_ALIAS_lastModTime
FROM TEST
WHERE CV_Modstamp <= '2017-10-27 18:45:44 +00:00'
GROUP BY id) T
WHERE A.id = T.T_ALIAS_ID
AND A.CV_Modstamp = T.T_ALIAS_lastModTime
AND A.SF_Deleteddate IS NULL
)
D2 ON D1.ID = D2.ID
这给出了响应:
aaa 2017-10-28 22:45:44 +00:00 aaa 2017-10-27 18:45:44 +00:00
eee 2017-10-27 18:45:44 +00:00 eee 2017-10-27 18:45:44 +00:00
但是需要的是:
aaa 2017-10-28 22:45:44 +00:00
aaa 2017-10-27 18:45:44 +00:00
eee 2017-10-27 18:45:44 +00:00
eee 2017-10-27 18:45:44 +00:00
有没有办法在 union 上显示连接的集合?
编辑: 感谢大家的解决方案。对于 SQL Server,每一个都足够好。我希望在单个查询中实现这一点。也可能将类似的查询移植到其他数据库风格。
编辑2: 如果必须选择整个列集怎么办?
这可以通过 CTE 查询来实现
with subset1 as
(
select A.* FROM TEST A,
(
SELECT
id AS T_ALIAS_ID,
MAX( CV_Modstamp ) AS T_ALIAS_lastModTime
FROM
TEST
WHERE
CV_Modstamp <= '2017-10-27 18:45:44 +00:00'
GROUP BY
id
) T
WHERE
A.id = T.T_ALIAS_ID
AND A.CV_Modstamp = T.T_ALIAS_lastModTime
AND A.SF_Deleteddate IS NULL
)
, subset2 as
(
select A.* FROM TEST A,
(
SELECT
id AS T_ALIAS_ID,
MAX( CV_Modstamp ) AS T_ALIAS_lastModTime
FROM
TEST
WHERE
CV_Modstamp > '2017-10-27 18:45:44 +00:00'
AND CV_Modstamp <= '2017-11-14 18:45:44 +00:00'
GROUP BY
id
) T
WHERE
A.id = T.T_ALIAS_ID
AND A.CV_Modstamp = T.T_ALIAS_lastModTime
AND A.SF_Deleteddate IS NULL
)
select subset1.* from subset1, subset2 where subset1.id = subset2.id
union all
select subset2.* from subset1, subset2 where subset1.id = subset2.id
order by id, cv_modstamp;
【问题讨论】:
-
为什么要复制
eee? -
这是一种可能性:rextester.com/BUJY49274
-
@gh9 感谢您指出这一点。将第一组 where 子句更新为
WHERE CV_Modstamp > '2017-10-27 18:45:44 +00:00' AND CV_Modstamp <= '2017-11-14 18:45:44 +00:00'
标签: sql sql-server join union