Требуется помощь со сложным SQL-запросом с самостоятельным соединением

myTable имеет составной ключ, состоящий из столбцов A и B (всего столбцов A, B, C, D, E).

Я хочу исключить/игнорировать записи, в которых значение D (скажем, номер заказа) одинаково, а E (скажем, решение) равно Y в одном, но N или Null в другом. (означает, что все двойные записи с одинаковым порядковым номером (равным значением D), которые были заказаны первыми (поэтому E=Y), а затем снова отменены (поэтому E=N), следует игнорировать)

Итак, я вытащил A, B для всех записей, где D один и тот же, но E - это Y в одной и N в другой.

SELECT * 
FROM myTable A, myTable B 
WHERE 
(A.D=B.D)
AND
((A.E ='Y' AND (B.E ='N' OR B.E IS NULL)) OR (B.E='Y' AND (A.E='N' OR A.E IS NULL)))

Теперь моим окончательным результатом должны быть все записи из myTable, но не записи, найденные выше.

Я написал запрос на соединение, но он не работает должным образом. В основном проблема заключается в том, как сравнить два составных ключа?

Образец данных:

A    B     C     D     E
=========================    
1    A     xyz   ONE   Y
2    B     pqr   TWO   Y
3    C     lmn   ONE   N
4    D     abc   THREE Y
5    E     ijk   FOUR  Y
=========================

Таким образом, моим выводом должны быть записи 2,4 и 5. Так как 1 и 3 будут проигнорированы. Потому что 1.D = 3.D и 1.E — это Y, а 3.E — это N.

Спасибо, Ник


person Vicky    schedule 12.08.2011    source источник
comment
Что именно вы пытаетесь сделать и почему бы не написать SELECT * from myTable WHERE CANCEL_FLAG != 'XYZ', если я правильно понял, что вы хотите?   -  person elevener    schedule 12.08.2011
comment
@elevener: обновил вопрос   -  person Vicky    schedule 12.08.2011
comment
Можете ли вы привести несколько примеров данных, а затем дать желаемый результат для этих данных примера? Это сделало бы ваш вопрос в 30 раз проще для понимания.   -  person Mark Byers    schedule 12.08.2011
comment
@Mark: обновил вопрос с примерами данных   -  person Vicky    schedule 12.08.2011
comment
Это очень похоже (если не является точной копией) этот вопрос.   -  person Andriy M    schedule 12.08.2011


Ответы (3)


Если я вас правильно понял, вам нужно следующее:

select x.*
from mytable x left outer join
    (   select mt1.a, mt1.b
        from mytable mt1 inner join
            mytable mt2 on mt1.d = mt2.d
        where ((mt1.E ='Y' AND (mt2.E ='N' OR mt2.E IS NULL)) OR (mt2.E='Y' AND (mt1.E='N' OR mt1.E IS NULL)))
    ) y on x.a = y.a and x.b = y.b
where y.a is NULL
person John N    schedule 12.08.2011

Я хочу исключить записи, в которых значение D равно «XYZ».

Почему бы просто не сделать такой запрос напрямую?

select  *
from    myTable
where   D <> 'XYZ'

Чтобы исключить строки из Temp, вы можете:

select  *
from    myTable 
where   not exists
        (
        select  *
        from    temp
        where   myTable.A = temp.A
                and myTable.B = temp.B
        )

Или с эксклюзивным левым соединением:

select  *
from    myTable 
left join
        temp
on      myTable.A = temp.A
        and myTable.B = temp.B
where   temp.A is null
person Andomar    schedule 12.08.2011

Вам нужно что-то вроде

select A.*
from myTable A 
WHERE (SELECT COUNT(*) FROM myTable B WHERE B.D = A.D AND (B.E IS NULL OR B.E = 'N')) = 0
person elevener    schedule 12.08.2011