Слияние существует, а не существует в одном запросе - PullRequest
0 голосов
/ 07 июня 2010

В ГДЕ части запроса мы имеем

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 ]

2 голосов
/ 07 июня 2010
SELECT distinct st.* 
FROM SomeTable st 
     left outer join Tab t
     on st.a in (t.a,t.b)
WHERE t.c is null

Иногда самый простой ответ - использовать объединение, а не существование.

0 голосов
/ 07 июня 2010

Я думаю, что у меня есть

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)

подойдет?

0 голосов
/ 07 июня 2010

Это выглядит , как будто вы пытаетесь вернуть все значения SomeTable, если на вкладке нет соответствующего значения, где 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)

Однако это не точно , что делает ваш существующий запрос - в вашем запросе, если на вкладке есть две соответствующие записи, где одна запись имеет ненулевое значение для C, а другая - NULL, Ваш запрос вернет соответствующую строку, но мой запрос не будет.

0 голосов
/ 07 июня 2010

Попробуйте:

NOT EXISTS (SELECT 1 FROM Tab WHERE (Tab.A = @Id OR Tab.B = @ID)
            AND (Tab.C is null OR Tab.C != @Var))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...