2012-12-14 43 views
5

Tôi đang cố gắng tham gia các bảng dựa trên các cột nhất định nằm trong phạm vi thời gian được chỉ định. Tôi đã thử một số phương pháp và không thể giải quyết vấn đề này.Netezza SQL để tham gia một bảng nếu bảng đó chứa dữ liệu có liên quan

Tôi bắt đầu với một truy vấn đơn giản:

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

trả về 1 hàng.

Sau đó tôi thêm bảng khác:

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

trả về 4 dòng dựa trên 4 mục trong bảng mrd cho unitID đó. Nhưng không cái nào trong số này có liên quan đến ngày đó nên tôi không muốn thấy thông tin đó.

Vì vậy, tôi cố gắng này:

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) 

nhưng điều này đưa ra một lỗi nói rằng họ hy vọng một "" trước khi 'mrd.unitid' ở dòng cuối cùng.

Vì vậy, tôi cũng đã cố gắng này:

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

nhưng điều này không trả lại bất kỳ dòng.

Vì vậy, để rõ ràng, những gì tôi muốn từ truy vấn cụ thể này là 1 hàng có thông tin dựa trên c.calledofftime và không có thông tin được lấy từ bảng khác vì không có dữ liệu có liên quan dựa trên thời gian mrd.effective . Cảm ơn

+0

Vì vậy, về cơ bản, bạn đang tìm cách tham gia 'mktdmtunit' với' mktmanualdispatch_all', cho đơn vị id 2756, trong đó thời gian được gọi là từ 12/5 lúc 5 giờ sáng và 12/6 lúc 5 giờ sáng, và thời gian hiệu quả của công văn cũng là giữa 12/5 lúc 5 giờ sáng và 12/6 lúc 5 giờ sáng? –

+0

Vâng mktdmtunit là bảng "chính" nhưng nếu không bạn là chính xác. Tôi thực sự đã giải quyết điều này bằng cách làm cho sự tham gia bên trong trên bit cuối cùng của mã của tôi một bên ngoài tham gia bên ngoài. Nó sẽ không cho phép tôi đăng câu trả lời thực sự vì tôi mới ở đây. –

+1

Bạn cần có đủ đặc quyền để có thể gửi câu trả lời cho câu hỏi của mình ngay bây giờ. – DMK

Trả lời

1

Nó đã được trả lời bởi poster, nhưng vâng, trái tham gia bảng thứ hai và bao gồm các tiêu chí mrd.effectivetime trong logic kết nối để bạn sẽ nhận được NULL nếu không tồn tại. Điều này sẽ cho phép bạn duy trì thông tin cốt lõi của mình từ bảng chính.

0

Lưu ý: Tôi sẽ chỉ tham khảo "điều kiện 5 tháng 12 năm 2012 5 giờ sáng đến 6 tháng 12 năm 2012 5 giờ sáng" của bạn dưới dạng "= ngày 5 tháng 12" cho ngắn gọn.

Các truy vấn thứ hai: OR trên dòng cuối cùng thứ hai có nghĩa là nó sẽ tham gia vào bảng trên kết quả unitID và giới hạn unitID = 2756 và giới hạn thêm hàng cho những nơi DÙ mktdmtunit.calledofftime HOẶC mktmanualdispatch_all.effectivetime = tháng mười hai 5 (hoặc cả hai đều = ngày 5 tháng 12). Bạn nhận được 4 hàng trả về vì có 4 hàng trong mktmanualdispatch_all với unitid = 2756.

Truy vấn thứ tư VÀ các điều kiện về thời gian này: hàng trả về phải có BOTH được gọi là = Ngày 5 tháng 12 và hiệu lực = Ngày 5 tháng 12. Tôi không chắc chắn về logic hoặc NGUYÊN LÝ mà bạn muốn, nhưng tôi nghĩ đó là EITHER, bởi vì bạn dường như mong đợi điều này để trả về một số hàng.

Lỗi cú pháp cho truy vấn thứ 3 - Tôi nghĩ đó là do bạn thiếu dấu ngoặc đơn đóng. Bạn mở hai: "OR (tồn tại (SELECT mrd.effectivetime ..." nhưng chỉ gần một: "... VÀ c.unitid = mrd.unitid)"

Tôi đề nghị

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

Điều này sẽ trả về tất cả các cột của mktdmtunit trong đó unitid là 2756 và một trong hai tên gọi là nghỉ là trong phạm vi ngày 5 tháng 12, HOẶC nơi mktmanualdispatch_all.effectivetime nằm trong phạm vi ngày 5 tháng 12,

Các vấn đề liên quan