2010-05-13 5 views
2

У меня есть таблица заказов для определенных продуктов и таблица продуктов, которые в продаже. (Это не идеальная структура базы данных, но это не входит в мой контроль.) Я хочу, чтобы внешнее соединение таблицы заказов с таблицей продаж через номер продукта, но я не хочу включать какие-либо конкретные данные из таблицы продаж, Я просто хочу Y, если соединение существует или N, если оно не выводится. Может ли кто-нибудь объяснить, как я могу это сделать в SQL?Не знаете, как использовать Decode, NVL и/или isNull (или что-то еще?) В этой ситуации

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

ответ

4

Вы должны быть в состоянии использовать CASE конструкцию, и это будет выглядеть примерно так:

select 
    order.foo, 
    case 
     when sale.argle is null then 'N' 
     else 'Y' 
    end 
from order 
left join sale on order.product_number = sale.product_number; 
+0

Спасибо за быстрый ответ! Я попробую это сейчас. – RSW

+1

Просто убедитесь, что продажа является отношением 1 к 1 для product_number. Например, если товары в продаже были разбиты по регионам вашим клиентом, я получаю счета за один и тот же товар четыре раза (если товар продавался в 4 регионах) –

0

Try (непроверенные):

SELECT O.*, DECODE(NVL(p.product_num, 'X'), 'X', 'N', 'Y') 
    FROM Orders AS o LEFT JOIN Products AS p ON o.Product_Num = p.Product_Num 

NVL переведет аннулирует в «р .product_num 'to' X ', который будет сравниваться с «X» в DECODE, генерируя «N»; ненулевые номера продуктов будут числом, не равным «X», и, следовательно, сгенерируют «Y».

+0

Это похоже на то, что я пытался сделать, но Я думаю, что первый ответ более ясен. Благодаря! – RSW

+0

(Ваш ответ совершенно ясен, я имел в виду сам код) – RSW

2

Я nornally использовать NVL2 для такого рода ситуации ...

SELECT col_one 
    , NVL2(col_one, 'Y', 'N') col_one_exists 
    , col_two 
    , NVL2(col_two, 'Y', 'N') col_two_exists 
    FROM (SELECT '12345' col_one 
       , NULL col_two 
      FROM dual 
     ) 

вернуться бы это: -

COL_ONE COL_ONE_EXISTS COL_TWO COL_TWO_EXISTS 
12345 Y       N 
+0

NVL2 - это спецификация Oracle - оператор CASE ANSI, поэтому он более переносимый. –

+1

Вопрос был помечен для Oracle, поэтому я ответил соответственно. Независимость базы данных - это не то, к чему я стремлюсь. Цитата: «Вы хотите максимизировать инвестиции в свою базу данных. Вы хотите разработать лучшее программное обеспечение за минимальное время для этой базы данных. Единственный способ сделать это - полностью использовать то, что может предложить база данных». Эффективный Oracle по дизайну - Том Ките –

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

  • Нет связанных вопросов^_^