首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netezza SQL用于连接表(如果该表包含相关数据

Netezza SQL用于连接表(如果该表包含相关数据
EN

Stack Overflow用户
提问于 2012-12-15 01:47:30
回答 2查看 8.8K关注 0票数 5

我正在尝试基于特定的列在指定的时间范围内连接表。我尝试了几种方法,但都没能解决这个问题。

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

代码语言:javascript
复制
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行。

然后添加另一个表:

代码语言:javascript
复制
 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行。但是这些都不是与那个日期相关的,所以我不想看到这些信息。

所以我试了一下:

代码语言:javascript
复制
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“之前需要一个",”。

所以我也试了一下:

代码语言:javascript
复制
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时间的相关数据。谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-01-08 05:22:28

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

票数 1
EN

Stack Overflow用户

发布于 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)“

我建议

代码语言:javascript
复制
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日日期时间范围内,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13883766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档