1

次のコードを小さくしようとしています。これは可能ですか?

select a.*
from table1 a
WHERE a."cola1" = 'valuea1'
UNION ALL
select a.*
from tablea1 a
inner join tablea2 b on a."cola2" = b."colb2"
WHERE a."cola1" = 'valuea2'
  and b."colb3" = 'valueb3'

実際には、value1 または value2 の table1 からレコードを探していますが、value2 に一致するレコードについては、2 番目のテーブルへの結合を含む 1 つの追加条件を適用したいと考えています。これは UNION 句なしで実行できますか?

スケルトンまたは私がコーディングしようとしているものは以下のとおりです....しかし、それは自然に機能していません.

select a.*
from table1 a
inner join table2 b on a."cola1" = b."COLb1"
WHERE a."cola2" IN ('valuea1','valuea2')
  and 
  CASE 
    WHEN a."cola2" = 'valuea2' THEN b."colb1" = 'valueb3'
    ELSE 1=1
  END CASE
4

4 に答える 4

5

ステートメントは結合条件で機能すると思いますCASEが、よくわかりません。しかし、これはあなたのために働くでしょうか?

select *
  from table1 a
 where a.cola1 = 'valuea1'
    or (a.cola1 = 'valuea2'
        and Exists(select 1
                     from table2 b
                    where a.cola2 = b.colb2
                      and b.colb3 = 'valueb3'
                   )
        )

編集:これはうまくいきませんか?

select a.*
  from table1 a
  Left Outer Join table2 b On (a.cola2 = b.colb2)
 where a.cola1 = 'valuea1'
    or (a.cola1 = 'valuea2' and b.colb3 = 'valueb3')
于 2009-01-09T11:35:01.020 に答える
4

全体として、述語を完全に書き直すという Hosam の提案に従う必要があります。しかし、元の問題をさらに説明するために、問題は SQL では CASE .. END がであり、他の式を使用できる場所でのみ使用できることです。「a=b」のような条件は、論理演算子で接続された 2 つの式です。これをブール式と考えたいと思うかもしれませんが、それは SQL の見方ではありません。

次のように、条件の 2 つの式の 1 つとして CASE を使用することで、CASE で目的を達成できます。

WHERE a."cola2" IN ('valuea1','valuea2')
  and 
  b."colb1" = CASE 
                WHEN a."cola2" = 'valuea2' THEN 'valueb3'
                ELSE b."colb1"
              END CASE

(colb1 に NULL を含めることが可能な場合は、それを処理するために変更する必要があります。)

于 2009-01-09T14:09:44.820 に答える
0

これは、左結合と where 条件を使用して実現できます

select a.*
from table1 a
left join tablea2 b on a."cola2" = b."colb2"
WHERE a."cola1" = 'valuea2'
  and ( b."colb2" is null or b."colb3" = 'valueb3' )
于 2016-12-06T22:18:33.490 に答える
-1

OP: 私は近くに行く小さな回避策を持っています (これはこれが内部結合である場合にのみ機能する可能性があります)。

select a.* from table1 a internal join table2 b on a."cola1" = b."COLb1" WHERE (a."cola2" = 'valuea1') OR (a."cola2" = 'valuea2' and b." colb1" = 'valueb3')

コードを書き出すと、別の考え方が促されることがあります。自己療法の一種。ご意見ありがとうございます。

于 2009-01-09T11:44:49.387 に答える