我正在尝试基于特定的列在指定的时间范围内连接表。我尝试了几种方法,但都没能解决这个问题。
我从一个简单的查询开始:
SELECT *
FROM admin.mktdmtunit c
WHERE c.unitid IN ('2756')
AND c.calledofftime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
AND to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')这将返回1行。
然后添加另一个表:
SELECT *
FROM admin.mktdmtunit c
INNER JOIN admin.mktmanualdispatch_all mrd
ON c.unitid = mrd.unitid
where c.unitid in ('2756')
AND (c.calledofftime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')
OR mrd.effectivetime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss'))这将根据该unitid的mrd表中的4个条目返回4行。但是这些都不是与那个日期相关的,所以我不想看到这些信息。
所以我试了一下:
SELECT *
FROM admin.mktdmtunit c
where c.unitid in ('2756')
AND c.calledofftime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')
OR (exists(SELECT mrd.effectivetime
FROM admin.mktmanualdispatch_all mrd
WHERE mrd.effectivetime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')
AND c.unitid = mrd.unitid)但这会给出一个错误,说明在最后一行的"mrd.unitid“之前需要一个",”。
所以我也试了一下:
SELECT *
FROM admin.mktdmtunit c
INNER JOIN admin.mktmanualdispatch_all mrd
ON
mrd.effectivetime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')
AND c.unitid = mrd.unitid
where c.unitid in ('2756')
AND c.calledofftime between to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')但这不会返回任何行。
因此,为了清楚起见,我希望从这个特定查询中得到的是1行,其中包含基于c.calledofftime的信息,并且没有从其他表中拉入的信息,因为没有基于mrd.effective时间的相关数据。谢谢
发布于 2013-01-08 05:22:28
发帖者已经回答了这个问题,但是的,左连接第二个表,并在连接逻辑中包含mrd.effectivetime条件,因此如果不存在空值,您将收到NULL。这将允许您维护主表中的核心信息。
发布于 2013-12-24 09:31:36
注意:为简洁起见,我仅将您的“2012年12月5日上午5点到2012年12月6日上午5点”条件称为"= 12月5日“。
第二个查询:倒数第二行上的OR意味着它将连接unitid上的表,并将结果限制为unitid = 2756,并进一步将行限制为mktdmtunit.calledofftime或mktmanualdispatch_all.effectivetime = Dec 5(或者它们都= Dec 5)的那些行。您将返回4行,因为在mktmanualdispatch_all中有4行的unitid = 2756。
第四个查询AND的这些datetime条件:返回的行必须同时具有calledofftime = Dec 5和effectivetime = Dec 5。我不确定您想要哪一个或两个逻辑,但我认为它是任一逻辑,因为您似乎希望它返回一些行。
第三个查询的语法错误--我想是因为你漏掉了一个右括号。你打开两个:"OR (exists(SELECT mrd.effectivetime ...)“但只有一个接近:"...和c.unitid = mrd.unitid)“
我建议
SELECT c.*
FROM admin.mktdmtunit c
where c.unitid in ('2756')
AND ( (c.calledofftime between to_timestamp('2012-12-05 05:00:01',
'yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00',
'yyyy-mm-dd hh:mi:ss')
)
OR (exists (SELECT mrd.effectivetime
FROM admin.mktmanualdispatch_all mrd
WHERE (mrd.effectivetime between
to_timestamp('2012-12-05 05:00:01','yyyy-mm-dd hh:mi:ss')
and to_timestamp('2012-12-06 05:00:00','yyyy-mm-dd hh:mi:ss')
)
AND c.unitid = mrd.unitid
)
)
) ;这将返回mktdmtunit的所有列,其中unitid是2756,并且calledofftime在12月5日日期时间范围内,或者mktmanualdispatch_all.effectivetime在12月5日日期时间范围内,
https://stackoverflow.com/questions/13883766
复制相似问题