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

unn*_*way 5 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')
Run Code Online (Sandbox Code Playgroud)

返回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'))
Run Code Online (Sandbox Code Playgroud)

返回4行,基于mrd表中4个条目的unitid.但这些都与那个日期无关,所以我不希望看到这些信息.

所以我尝试了这个:

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)
Run Code Online (Sandbox Code Playgroud)

但这会给出一个错误,说它在最后一行的"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')
Run Code Online (Sandbox Code Playgroud)

但这不会返回任何行.

所以要明确的是,我想从这个特定查询中得到的是1行,其中包含基于c.calledofftime的信息,并且没有从其他表中提取的信息,因为没有基于mrd.effective时间的相关数据.谢谢

Eri*_*ice 1

发帖者已经回答了这个问题,但是,是的,左连接第二个表并在连接逻辑中包含 mrd. effectivetime 标准,这样如果不存在,您将收到 NULL。这将允许您维护主表中的核心信息。