我有这个查询
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.*
它没有。
我该怎么办?
答案 0 :(得分:0)
好的,如果table1
和table2
包含来自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 *
之类的内容。