2012-06-12 1 views
0

У меня есть логическая головоломка, которую я не могу понять.Как сравнить два столбца с комбинацией из двух столбцов в таблице в Oracle?

У меня есть таблица с двумя столбцами, представляющими PK. не Prods и Prod_Colour

TableA 
Prods, Date_, Prod_Colour 

One | null  | Red 
One | null  | Blue 
Two | 2012-06-08| Blue 
Two | null | Yellow 
Three| null | Green 
Three| 2012-06-08| Red 

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

Я могу ограничивать строки на основе даты.

SELECT a.* 
FROM TABLEA a 
WHERE Date_ > '2012-06-11' or Date_ IS NULL 

но то, что мне нужно сделать, это использовать эту таблицу в подзапросе, где оба Prods и Prod_Colour объединены в исключении ...

это не хорошее объяснение, но в основном в приведенном выше примере щупы три где Prod_Colour = 'Red' и Prods Two, где Prod_Colour = 'Blue' будет исключен, но Prods One будет включен как для Prod_Colour, где дата была> чем сегодня, так и для null.

Как всегда я ценю любые советы или подсказки.

Заранее спасибо.

Чтобы уточнить, у меня есть запрос, который выбирает из нескольких разных таблиц, среди одной из этих таблиц мне нужно включить prods и prod_Colour только там, где prods и Prod_Colour (объединенные как уникальный идентификатор для каждой строки) доступны в Таблица A, где date_ указывает, что они доступны. Комбинации не будут меняться, но дата_ может. Я бы использовал tDate, чтобы сегодня указывать дату сравнения.

Select O.Prods, O.Prod_Colour /*each combination needs to match the combination in TableA */ 
FROM TableB 
Where O.Prods + O.Prod_C in (Select A.Prods + A.Prod_Colour 
          FROM TABLE A WHERE Date_ IS NULL or Date_ > tDate) 

что-то в этом духе.

ответ

5

На основе вашего последнего редактирования, кажется, что вы ищете эту конструкцию:

SELECT * 
    FROM tableB 
WHERE (prods, prod_colour) IN 
     (SELECT prods, prod_colour 
      FROM tablea a 
     WHERE date_ > tDate OR date_ is NULL); 
+0

Это то, что я искал, Ты не представляешь, насколько запутались мои попытки. Мне нужно тщательно протестировать его, но исходные результаты выглядят точно так, как мне нужно. – dee

0
SELECT a.* 
FROM TABLEA a 
WHERE (Date_ > '2012-06-11' or Date_ IS NULL) 
AND not (Prods = 'Two' and Prod_Colour = 'Blue') 
AND not (Prods = 'Three' and Prod_Colour = 'Red') 
+0

Вам понадобятся скобки ИЛИ условие, иначе это будет неправильно. –

+0

Спасибо за ответ SQl, к сожалению, я не могу исключить через жестко заданные значения, поскольку даты могут меняться для разных строк в разные дни в зависимости от доступности Prods. поэтому завтра мне может потребоваться исключить Prods = 'Two' и Prod_Colour = 'Blue' – dee

+0

@dee: так как вы знаете, какие продукты следует исключать на основе даты? Есть ли дата сохранения? –

Смежные вопросы