2017-05-12 7 views
1

enter image description here私はSQLフィルタを作成していて、User_Condition内にスペースが限られていますので、実行しているネストされたクエリの前にORを使用できるかどうか疑問です。2つの別々の列がネストされたクエリにあります

ここに、動作するベースコードの例と、私が達成しようとしているものの例を示します。そして句を皮切り

select * 
from tlorder 
where detail_line_id = '3806526' 
    and (origpc in (select zone_id 
        from zone 
        where (zone_id = origpc 
        and service_type = 'DIRECT' or zone_id = destpc 
        and service_type <> 'DIRECT')) 
    or desctpc in (select zone_id 
        from zone 
        where (zone_id = origpc and service_type = 'DIRECT' or 
         zone_id = destpc and service_type <> 'DIRECT'))) 

は、フィルタ値であるが、このような何かのためにどんな選択肢がある場合、私は疑問に思って:

select * 
from tlorder 
where detail_line_id = '3806526' 
    and (origpc OR destpc) in (select zone_id 
          from zone 
          where (zone_id = origpc and service_type = 'DIRECT' or 
            zone_id = destpc and service_type <> 'DIRECT')) 

- それはポーズので、私は強調表示されたセクションを編集することはできません最大の問題。

答えて

1
( 
    origpc IN (SELECT zone_id FROM zone 
    WHERE ( (
      zone_id = origpc 
      AND service_type = 'DIRECT' 
      ) 
      OR 
      (
      zone_id = destpc 
      AND service_type <> 'DIRECT' 
      ) 
     ) 
    OR destpc IN (SELECT zone_id FROM zone 
    WHERE ( (
      zone_id = origpc 
      AND service_type = 'DIRECT' 
      ) 
      OR 
      (
      zone_id = destpc 
      AND service_type <> 'DIRECT' 
      ) 
     ) 
    ) 

これは機能するはずです。

+0

これは残念なことに、フィルタのselect文と表は石で設定されているため、X = Xの後にしか編集できません。また、スクリーンショットを追加します。 – Landers

+0

申し訳ありませんが、私は理解が間違っています....なぜ彼らは石で設定されますか?私が提供したロジックは、よりクリーンな方法で実行されたものと同じです。 –

+0

これは長すぎないといいですね。 –

1

あなたのサブクエリのwhere句に制限ロジックを追加し、INをEXISTSに変更することをお勧めします。実際には、サブクエリ内の行をどのようにフィルタリングしているかによって、これをほぼ完了しています。これはあなたのために働く必要があります:それはシンプルだし、何も遅くはありませんので、私はちょうど1を使用する存在の内側にあなたが任意の値を選択することができます

select * 
    from tlorder 
where detail_line_id = '3806526' 
    and EXISTS (select 1 
       from zone 
       where (zone_id = origpc and service_type = 'DIRECT') or 
         (zone_id = destpc and service_type <> 'DIRECT') 
       ) 

注意。また、私はあなたのどこにサブクエリより具体的なかっこを作った。

特定の質問に答えるために、INステートメントの左側に複数の列を使用することはできません。ただし、サブクエリを使用していない場合は、INの右側で可能です。例:

select * 
    from tlorder 
where detail_line_id = '3806526' 
    and 123 in (origpc, destpc) 
関連する問題