Как выбрать строки, которые не соответствуют соответствующим строкам в одной таблице? - PullRequest
2 голосов
/ 28 февраля 2012

Я пытаюсь выяснить, как обработать этот запрос.

У меня есть таблица с несколькими столбцами.Из этих столбцов есть два: colA и colB.

Значения в colA и colB в строке будут совпадать с другой строкой в ​​той же таблице, однако фактические значения в этих столбцах не будут равны.

Таким образом, для любой строки:

Col_A | Col_B
val1.0  | val2.0

будет еще одна строка

Col_A | Col_B
val1.1| val2.1

Существует исключение, когда этой соответствующей строки не существует, и именно эту строку янужно выбрать.

Любая помощь с логикой вокруг этого очень ценится.

Я работал с запросами этого типа

Select * 
from table1 e 
where (e.Col_A = val1.0 and e.Col_B = val2.0)
and (e.Col_A != val1.1 and e.Col_B ! = val2.1)

это даже близко?Вышесказанное поражает, когда я пишу, что если одно из условий истинно, то и другое также должно быть истинным.

Заранее благодарим за любую помощь или подсказки.

Дополнительная информация, поскольку были запросы науточнение.

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

Таблица содержит около 12 столбцов, и два из этих столбцов могут иметь одно из двух возможных значений.Типы значений для этих двух столбцов: varchar2 (30). Обычно для любой строки, имеющей набор значений, будет другая строка с другими значениями.Некоторые другие несвязанные столбцы могут быть одинаковыми, но не обязательно.

Код, который я реализовал, похож на приведенный ниже и основан на предложении левого соединения от KAJ.Однако кажется, что он возвращает слишком много строк в прямом запросе, и при обновлении он фактически обновляет каждую строку.

Update TableA Set Col_Ex = ('Exception')
Where Exists 
(Select ... Example from Kaj s suggestion below);

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Предполагая следующее:
1. Значения являются фиксированными (то есть от 1,0 до 1,1 и от 2,0 до 2,1)
2. То, что вы ищете, это оригинальная строка, в которой соответствующая строка не существует
3. Соединение между исходной и соответствующей строками находится в столбцах, которые вы не упомянули (я назвал это ключом ниже)
... тогда должно работать что-то вроде следующего:

select original.*
from table original
  left outer join table corresponding on corresponding.key = original.key and corresponding.Col_A = 'val1.1' and corresponding.Col_B = 'val2.1'
where original.Col_A = 'val1.0'
  and original.Col_B = 'val2.0'
  and corresponding.key is null
2 голосов
/ 28 февраля 2012
Select e.*  from table e
where (e.Col_A = val1.0 and e.Col_B = val2.0) 
and NOT EXISTS(SELECT * FROM table e2 
           WHERE e2.Col_A = val1.1 
           and e2.Col_B = val2.1 AND e2.key = e.key) 
1 голос
/ 28 февраля 2012

Я предполагаю, что ваши значения 1.0 и 1.1 являются лишь одним примером из многих. В противном случае не было бы нескольких записей для поиска. Вы ищете значения, где A2 = (A1 + 0,1)? Если это так, вы можете использовать что-то вроде этого:

select t1.col_a, t1.col_b
from table t1
left join table t2 on 
    (t2.col_a = t1.col_a + 0.1 and t2.col_b = t1.col_b + 0.1)
where
    t2.col_a is null and t2.col_b is null

LEFT JOIN вернет нулевые значения, если нет записи, соответствующей критериям соединения.

...