2012-12-14 60 views
5

我想基於特定時間範圍內的某些列連接表。我已經嘗試了幾種方法,並沒有能夠解決這個問題。Netezza SQL加入表,如果該表包含相關數據

我先從一個簡單的查詢:

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

,基於在該單元ID的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') 

但這並不返回任何行。

所以要清楚,我想從這個特定查詢中得到的是一行,它具有基於c.calledofftime的信息並且沒有從另一個表中拉入信息,因爲沒有基於mrd有效時間的相關數據。 謝謝

+0

因此基本上,您希望加入'mktdmtunit'和'mktmanualdispatch_all',單元ID爲2756,其中被叫停用時間爲凌晨5點至12點和12/6上午5點,發送有效時間也在上午5點的12/5和上午5點的12/6之間? –

+0

那麼mktdmtunit是「主」表,但否則你是正確的。我實際上已經解決了這個問題,通過將最後一位代碼的內連接放在左外連接上。因爲我是新來的,所以不會讓我發佈實際的答案。 –

+1

你應該有足夠的特權才能夠現在提交你的問題的答案。 – DMK

回答

1

它已經被海報回答了,但是,是的,左連接第二個表,並在連接邏輯中包含mrd.effectivetime條件,所以如果不存在,您將收到NULL。這將允許您維護主表中的核心信息。

0

注意:爲了簡潔起見,我只是將您的「2012年12月5日上午5點至2012年12月6日上午5點」 條件視爲「= 12月5日」。

第二個查詢:在上或第二最後一行意味着它將加入上的UnitID和限制的結果的表 到單元ID = 2756,並進一步限制行的那些 其中或者mktdmtunit.calledofftime OR mktmanualdispatch_all.effectivetime =十二月第5個 (或者他們都是= 12月5日)。您返回4行,因爲mktmanualdispatch_all中有4行,其中unitid = 2756.

第四個查詢AND的這些日期時間條件:返回的行必須同時有所謂的offtime= Dec 5th值AND effectivetime = Dec 5th。我不確定你想要的是哪種邏輯或者兩種邏輯,但我認爲它是其中的一種,因爲你似乎期望這會返回一些行。

第三個查詢的語法錯誤 - 我認爲這是因爲你錯過了一個右括號。您打開兩個: 「OR(存在(選擇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 
        ) 
      ) 
     ) ; 

這將返回其中unitid爲2756的所有mktdmtunit列,並且其中的所有已關閉時間都在Dec 5日期時間範圍內,即 或其中mktmanualdispatch_all。有效時間是在12月5日的日期時間範圍內,