【问题标题】:Netezza SQL to join a table if that table contains relevant data如果该表包含相关数据,Netezza SQL 将加入该表
【发布时间】: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 时间的相关数据。 谢谢

【问题讨论】:

  • 所以本质上你希望加入mktdmtunitmktmanualdispatch_all,单位 id 2756,取消时间在 12/5 凌晨 5 点到 12/6 凌晨 5 点之间,而且派送有效时间也是12/5凌晨5点到12/6点5点之间?
  • 嗯 mktdmtunit 是“主”表,否则你是正确的。实际上,我通过将最后一段代码的内连接设置为左外连接来解决了这个问题。因为我是新来的,所以它不会让我发布实际答案。
  • 您现在应该有足够的权限来提交您的问题的答案。
  • 写得很好的问题。欢迎来到 SO。

标签: sql netezza


【解决方案1】:

发帖人已经回答了,但是,是的,离开加入第二个表并在加入逻辑中包含 mrd.effectivetime 标准,这样如果不存在,您将收到 NULL。这将允许您维护来自主表的核心信息。

【讨论】:

    【解决方案2】:

    注意:我只是指您的“2012 年 12 月 5 日凌晨 5 点至 2012 年 12 月 6 日凌晨 5 点” 为简洁起见,条件为“= Dec 5th”。

    第二个查询:倒数第二行的 OR 表示它将加入表 在 unitid 上并将结果限制为 unitid = 2756 并进一步将行限制为那些 其中 mktdmtunit.callofftime 或 mktmanualdispatch_all.effectivetime = 12 月 5 日 (或者他们都 = 12 月 5 日)。您会返回 4 行,因为 mktmanualdispatch_all 中有 4 行,unitid = 2756。

    第四个查询 AND 的这些日期时间条件:返回的行必须同时调用 offtime = Dec 5th 值 AND Effectivetime = Dec 5th。我不确定您想要哪种逻辑或两种逻辑,但我认为它是 EITHER,因为您似乎希望这会返回一些行。

    第三个查询的语法错误 - 我认为这是因为您缺少右括号。您打开两个:“OR (exists(SELECT mrd.effectivetime ...”但只关闭 一:“... AND 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 并且被调用的关闭时间在 12 月 5 日日期时间范围内, 或者 mktmanualdispatch_all.effectivetime 在 12 月 5 日的日期时间范围内,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2018-11-09
      • 2012-01-02
      相关资源
      最近更新 更多