4

我希望能够设置添加一个字段来回答“对于此记录中的值,该值是否满足另一个表中的某些条件?”的问题。我想我会尝试case-when使用a 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

可能有不止一种解决方案。有时这两个表之间存在关系。然后我做一个 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

我知道仅在 WHERE 子句中使用 EXISTS “我只想要以下 SELECT 给我一些东西的行”。只有在一张和另一张表之间存在某种联系时,这才有意义。

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

不要在你的存在中使用 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 回答
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 回答