【发布时间】:2012-12-02 18:06:54
【问题描述】:
我正在尝试根据指定时间范围内的某些列连接表。我已经尝试了几种方法,但都无法解决这个问题。
我从一个简单的查询开始:
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.callofftime 的信息,并且没有从另一个表中提取的信息,因为没有基于 mrd.effective 时间的相关数据。 谢谢
【问题讨论】:
-
所以本质上你希望加入
mktdmtunit和mktmanualdispatch_all,单位 id 2756,取消时间在 12/5 凌晨 5 点到 12/6 凌晨 5 点之间,而且派送有效时间也是12/5凌晨5点到12/6点5点之间? -
嗯 mktdmtunit 是“主”表,否则你是正确的。实际上,我通过将最后一段代码的内连接设置为左外连接来解决了这个问题。因为我是新来的,所以它不会让我发布实际答案。
-
您现在应该有足够的权限来提交您的问题的答案。
-
写得很好的问题。欢迎来到 SO。