0

内部結合を実行した 2 つのテーブルがあります。2 つの条件に基づいて最初のテーブルから値をフェッチする必要があるシナリオがあります。

私のクエリは

SELECT rm.ROUTE_ID
            , rm.ROUTE_CODE
            , rm.START_PLACE_ID
            , rm.END_PLACE_ID
            , rm.IS_ACTIVE
            , rm.LINKED_ROUTE
        FROM OPRS_ROUTE_MASTER rm
        INNER JOIN OPRS_ROUTE_HALTS rh
            ON rh.ROUTE_ID = rm.ROUTE_ID
        WHERE rh.PLACE_ID  = '51'

ここで、where 句にさらに 2 つの条件が必要です。

case 1: when rm.START_PLACE_ID > 0 then i need to append AND rm.START_PLACE_ID to where clause

case 2: when rm.END_PLACE_ID > 0 then i need to append AND rm.START_PLACE_ID to where clause

両方がゼロより大きい場合は、両方のケースを where 句に追加する必要があります。

誰か助けてくれませんか

4

3 に答える 3

0

クエリを次のように設定します。

select rm.ROUTE_ID       ,
       rm.ROUTE_CODE     ,
       rm.START_PLACE_ID ,
       rm.END_PLACE_ID   ,
       rm.IS_ACTIVE      ,
       rm.LINKED_ROUTE
from OPRS_ROUTE_MASTER rm
join OPRS_ROUTE_HALTS  rh on rh.ROUTE_ID = rm.ROUTE_ID
                         and rh.PLACE_ID = '51'
where rm.START_PLACE_ID = case when rm.START_PLACE_ID > 0 then @myStartPlaceID else rm.START_PLACE_ID end
  and rm.END_PLACE_ID   = case when rm.END_PLACE_ID   > 0 then @myEndPlaceID   else rm.END_PLACE_ID   end

START_PLACE_IDテーブル行の目的の列 (または) に正の値がある場合END_PLACE_ID、その列は目的の値と比較されます。それ以外の場合は、それ自体と比較されます。

ORこれにより、オルタネーション (演算子)の使用が回避されます。使用ORすると、シークではなくテーブルまたはインデックスのスキャンが強制され、実行計画が低下する可能性があります。

于 2012-08-21T18:03:18.483 に答える
0

要件に欠けているものがない限り、またはWHEREを使用して別のフィルターを追加できますORAND

SELECT rm.ROUTE_ID
    , rm.ROUTE_CODE
    , rm.START_PLACE_ID
    , rm.END_PLACE_ID
    , rm.IS_ACTIVE
    , rm.LINKED_ROUTE
FROM OPRS_ROUTE_MASTER rm
INNER JOIN OPRS_ROUTE_HALTS rh
    ON rh.ROUTE_ID = rm.ROUTE_ID
WHERE rh.PLACE_ID  = '51'
OR (or AND)
(
    (rm.START_PLACE_ID > 0 OR rm.END_PLACE_ID > 0)
    AND rm.START_PLACE_ID = yourValue
)
于 2012-08-21T16:20:00.463 に答える