合并存在并且不存在于一个查询中 - oracle magic

时间:2010-06-07 11:49:31

标签: oracle plsql

在查询的WHERE部分,我们有

SELECT * FROM SomeTable st
WHERE 
NOT EXISTS 
  (SELECT 1 FROM Tab t1 WHERE t1.A = st.A OR t1.B = st.A)
OR EXISTS 
  (SELECT 1 FROM Tab t2 WHERE (t2.A = st.A OR t2.B = st.A) AND t2.C IS NULL)

似乎是合并的好候选人...... 但是我在没有任何想法的情况下盯着它看了一个小时。

你有什么想法吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

SELECT distinct st.* 
FROM SomeTable st 
     left outer join Tab t
     on st.a in (t.a,t.b)
WHERE t.c is null

有时最简单的答案是使用连接而不是存在。

答案 1 :(得分:0)

尝试:

NOT EXISTS (SELECT 1 FROM Tab WHERE (Tab.A = @Id OR Tab.B = @ID)
            AND (Tab.C is null OR Tab.C != @Var))

答案 2 :(得分:0)

我想我已经知道了

SELECT * FROM SomeTable st
WHERE 
0 = (SELECT SUM (NVL(t1.C,0) FROM Tab t1 WHERE t1.A = st.A OR t1.B = st.A)
你怎么看? 当然,这只适用于'C'预计为NULL的情况。 如果我们期待一些价值,我认为检查

@SomeValue IN (SELECT t1.C FROM Tab t1 WHERE t1.A = st.A OR t1.B = st.A)

会吗?

答案 3 :(得分:0)

看起来好像你试图返回所有SomeTable值,其中Tab上没有相应的值,其中C不为null - 在这种情况下,以下内容应该有效:

SELECT * FROM SomeTable st
WHERE NOT EXISTS 
  (SELECT 1 FROM Tab t1 WHERE (t1.A = st.A OR t1.B = st.A) AND t2.C IS NOT NULL)

但是,这不是完全现有查询的作用 - 在查询中,如果Tab上有两条相应的记录,其中一条记录的C为非空值,另一条记录为null ,您的查询将返回相应的行,但我的查询不会。

相关问题