2012-12-14 12 views
5

Próbuję połączyć tabele na podstawie pewnych kolumn znajdujących się w określonym przedziale czasu. Próbowałem kilku metod i nie byłem w stanie tego rozwiązać.Netezza SQL do przyłączenia się do tabeli, jeśli ta tabela zawiera istotne dane

rozpocząć w prosty zapytania:

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

która zwraca 1 wiersz.

Następnie dodać kolejną tabelę:

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

która zwraca 4 linie na podstawie 4 wpisów w tabeli mrd dla tego unitid. Ale żadna z nich nie odnosi się do tej daty, więc nie chciałbym widzieć tych informacji.

Więc próbowałem to:

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) 

ale to daje błąd mówiąc, że spodziewa się „” przed «mrd.unitid» w ostatnim wierszu.

Więc ja też próbowałem to:

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

ale to nie zwraca żadnych wierszy.

Tak więc, aby było jasne, co chcę z tego konkretnego zapytania jest 1 wiersz, który ma informacje oparte na c.calledofftime i nie ma informacji wciągniętej z drugiej tabeli, ponieważ nie ma odpowiednich danych w oparciu o mrd.efektywny czas . Dzięki

+0

Więc zasadniczo chcesz dołączyć do 'mktdmtunit' z' mktmanualdispatch_all', dla identyfikatora jednostki 2756, gdzie czas wywołania wynosi 12/5 o 5 rano i 12/6 o 5 rano, a czas skutecznej wysyłki to także 12/5 o 5 rano i 12/6 o 5 rano? –

+0

Dobrze mktdmtunit jest tabelą "główną", ale poza tym masz rację. Naprawdę to rozwiązałem, tworząc wewnętrzny łącznik na ostatnim fragmencie kodu lewe sprzężenie zewnętrzne. Nie pozwolę sobie na ogłoszenie odpowiedzi, ponieważ jestem tu nowy. –

+1

Powinieneś mieć wystarczająco dużo uprawnień, aby móc teraz przesłać odpowiedź na swoje pytanie. – DMK

Odpowiedz

1

Został już odebrany przez plakat, ale tak, lewo dołączyć do drugiej tabeli i zawierają kryteria mrd.effectivetime w logice łączenia, więc otrzymasz NULL, jeśli nie istnieją. Umożliwi to zachowanie podstawowych informacji z podstawowej tabeli.

0

Uwaga: Zamierzam odnieść się do "5 grudnia 2012 5 rano do 6 grudnia 2012 5 rano" stan jako "= 5 grudnia" dla zwięzłości.

drugie zapytanie: OR w przedostatniej linii oznacza, że ​​będzie połączyć tabele na unitid i końcowego prowadzi do unitid = 2756 i dalsze ograniczenie liczby wierszy na tych , albo gdy mktdmtunit.calledofftime lub mktmanualdispatch_all.effectivetime = Dec 5. (lub oboje = 5 grudnia). Otrzymasz 4 wiersze zwrócone, ponieważ istnieją 4 wiersze w mktmanualdispatch_all z unitid = 2756.

Czwarte zapytanie ORAZ takie warunki dotyczące datetime: zwracane wiersze muszą mieć ZARÓWNO o nazwie czas_off = 5-ta wartość ORAZ efektywność = 5 grudnia. Nie jestem pewien, która z logiki EITHER lub BOTH chciałaś, ale myślę, że to było EITHER, ponieważ wydajesz się, że spodziewasz się, że to zwróci kilka wierszy.

Błąd składniowy dla trzeciego zapytania - myślę, że jest tak, ponieważ brakuje nawiasu zamykającego. Otwierasz dwa: "OR (istnieje (SELECT mrd.effectivetime ...", ale tylko blisko jeden: "... I c.unitid = mrd.unitid)"

Proponuję

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

Spowoduje to zwrócenie wszystkich kolumn mktdmtunit, gdzie unitid ma wartość 2756, a nazwaofftime jest w przedziale czasu datowania 5 grudnia, LUB gdzie mktmanualdispatch_all.Efektywny czas jest w przedziale 5-go datetime,

Powiązane problemy