如果该表包含相关数据,则Netezza SQL加入表

时间:2012-12-14 17:47:30

标签: sql netezza

我正在尝试根据指定时间范围内的某些列来连接表。我已经尝试了几种方法并且无法解决这个问题。

我从一个简单的查询开始:

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'))

根据mid表中4个条目为该unitid返回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时间的相关数据。 感谢

2 个答案:

答案 0 :(得分:1)

海报已经回答了,但是,是的,请加入第二个表并在连接逻辑中包含mrd.effectivetime条件,这样如果不存在则会收到NULL。这将允许您从主表中维护核心信息。

答案 1 :(得分:0)

注意:我只想提及你的“2012年12月5日上午5点到2012年12月6日凌晨5点” 条件为“= Dec 5th”,以简洁。

第二个查询:第二行的OR表示它将连接表 在unitid上,将结果限制为unitid = 2756,并进一步限制行数 哪里有mktdmtunit.calledofftime或mktmanualdispatch_all.effectivetime = Dec 5th (或者他们俩= 12月5日)。返回4行,因为mktmanualdispatch_all中有4行,unitid = 2756。

第四个查询AND这些日期时间条件:返回的行必须有两个名为offofftime = Dec 5th value AND effectivetime = Dec 5th。我不确定你想要哪个EITHER或BOTH逻辑,但我认为它是EITHER,因为你似乎期望这会返回一些行。

第三个查询的语法错误 - 我认为这是因为你缺少一个右括号。你打开两个:“OR(存在(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,并且被叫时间位于Dec 5th日期时间范围内, 或者mktmanualdispatch_all.effectivetime在Dec 5th日期时间范围内,