5

指定された時間範囲内にある特定の列に基づいてテーブルを結合しようとしています。私はいくつかの方法を試しましたが、これを解決することができませんでした。

私は簡単なクエリから始めます:

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

しかし、これは行を返しません。

明確にするために、この特定のクエリに必要なのは、c.calledofftimeに基づく情報があり、mrd.effective timeに基づく関連データがないため、他のテーブルから情報が取得されない1行です。ありがとう

4

2 に答える 2

1

ポスターは既に回答済みですが、そうです、2 番目のテーブルに参加したままにし、結合ロジックに mrd.effectivetime 基準を含めて、何も存在しない場合は NULL を受け取ります。これにより、主要なテーブルからコア情報を維持できます。

于 2013-01-07T21:22:27.610 に答える