根据行所在的表选择列的不同值

时间:2016-12-19 10:26:59

标签: sql oracle case

我有这个查询

define LAST_DATE_BEFORE = to_date('03112016','ddmmyyyy')

with 
table1 as (some result),
table2 as (some result),
select
  MS.PAID_TRANS_IND,
  MS.CURR_PRICE_PLAN_KEY,
  case
    when MS.SEGMENT_KEY in t1.SEGMENT_KEY
    then MS.PLAN_SEGMENT_KEY
    when MS.SEGMENT_KEY in t2.SEGMENT_KEY
      and MS.START_ALLOC_DATE = &LAST_DATE_BEFORE + 1
    then MS.SEGMENT_KEY
    else null
  end as SEGMENT_KEY
  from MO_SU MS, table1 t1, table2 t2

表1和表2具有与表MO_SU不同的值。现在我只检查列值,但我想检查是否可以在t1 / t2中找到整行。

我认为这可以起作用

when MS.* in t1.*

它没有。

我该怎么办?

2 个答案:

答案 0 :(得分:0)

好的,如果table1table2包含来自MO_SU的记录,您可以这样做:

with
table1 as (select rowid r, s.* from MO_SU),
table2 as (select rowid r, s.* from MO_SU)
select what_you_need
from
MO_SU MS inner join (select * from table1 t1 union all select * from table2 t2) t on (MO_SU.rowid = t.r);

然而,我在这里看不到更深刻的感觉。代码是做什么的,因为如果您只使用MO_SU中的数据,则可以在with中选择它。 rowid是行的唯一标识符,因此如果您在CTE中附加rowid,则可以rowid上的联接仅过滤CTE中存在的数据。

答案 1 :(得分:0)

尝试将问题简化为检查另一个表中是否存在某个表的给定行,并且所有列中的值相等,而不是使用JOIN而只使用IN,您可能需要以下内容: (假设not null值):

with
  tab1(colA, colB, colC) as ( select 'a', 'b', 'c' from dual union all
                              select 'A', 'B', 'C' from dual 
                            ),
  tab2(columnA, columnB, columnC) as (  select 'a', 'b', 'c' from dual)
select *
from tab1 
where (colA, colB, colC) in ( select columnA, columnB, columnC from tab2) 

如果第二个表格中包含您需要检查的列,按正确的顺序而没有其他列,理论上您甚至可以将其编辑为:

...
where (colA, colB, colC) in ( select * from tab2)

但我绝对建议 NOT 使用这种方法:最好避免使用select *之类的内容。