4

「このレコードの値について、その値は別のテーブルの条件を満たしていますか?」という質問に答えるフィールドを追加できるようにしたいと思います。で試してみようと思いcase-whenましたexistsが、Teradata(私のdbms)はそれが好きではありません。何かお勧めはありますか?

select foo,
   (case when exists (select x.foo
                      from somedb x
                      where x.bar > 0)
    then '1' else '0' end) as MyFlag

from mydb
4

4 に答える 4

3

これにはおそらく複数の解決策があります。2つのテーブルの間に関係がある場合があります。次に、JOINを作成し、WHERE句で処理します。私はTeradataを知りませんが、Oracleではこのようなこともできます。

SELECT foo 
FROM   mydb
WHERE  (select count(*) from somedb where x.bar > 0) > 0

または多分あなたのコードのように

select foo,  
   (case when (select count(*)
                      from somedb x  
                      where x.bar > 0) > 0   
    then '1' else '0') as MyFlag       
from mydb

「次のSELECTが何かを与える行だけが欲しい」というWHERE句でのみEXISTSを使用することを知っています。これは、一方のテーブルともう一方のテーブルの間に何らかの接続がある場合にのみ意味があります。

select id,foo from mydb y
where exists (select x.id from somedb x where x.id = y.id)
于 2010-07-28T14:49:47.343 に答える
2

読みやすい解決策を思い付くことができなかったので(私がそうであるようにあなたが薄暗いときの鍵)、私は一時的なテーブルに結合しました:

create multiset table someDb.NiceFlags as
(
    select t.foo,
           '1' as myFlag
    from someDb.pos_txn_mstr t
    where exists(select x...)

  union all

    select t.foo,
           '0' as myFlag
    from someDb.pos_txn_mstr t
    where not exists(select x...)

) with data primary index(foo)

しかし今、私はタフな男のようには感じません:(

于 2010-07-28T20:15:57.617 に答える
0

フラグ値として1と0のみに関心があるので、次のことを試してください。

select foo,
   coalesce((select max(1)
             from somedb x
             where x.bar > 0), 0) as MyFlag
from mydb
于 2010-07-28T14:59:25.120 に答える
0

ケース内のexistsでfrom句を使用しないでください

Case when exists(select x.foo where blahblah>0 then 1 end) from mydb
Left /inner join somedb x
于 2012-08-02T18:00:39.110 に答える